Skip to content

Instantly share code, notes, and snippets.

@parzibyte
Created January 3, 2019 05:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save parzibyte/2de4c16c09439a2250427cdf874acf6d to your computer and use it in GitHub Desktop.
Save parzibyte/2de4c16c09439a2250427cdf874acf6d to your computer and use it in GitHub Desktop.
Número a dinero created by parzibyte - https://repl.it/@parzibyte/Numero-a-dinero
/**
* Función que convierte un número a su representación
* monetaria en JavaScript, por ejemplo, el número
* 123456 se convierte en $ 123, 456.00
*
* @author parzibyte
*/
const aMoneda = (numero, opciones) => {
// Valores por defecto
opciones = opciones || {};
opciones.simbolo = opciones.simbolo || "$";
opciones.separadorDecimal = opciones.separadorDecimal || ".";
opciones.separadorMiles = opciones.separadorMiles || ",";
opciones.numeroDeDecimales = opciones.numeroDeDecimales >= 0 ? opciones.numeroDeDecimales : 2;
opciones.posicionSimbolo = opciones.posicionSimbolo || "i";
const CIFRAS_MILES = 3;
// Redondear y convertir a cadena
let numeroComoCadena = numero.toFixed(opciones.numeroDeDecimales);
// Comenzar desde la izquierda del separador o desde el final de la cadena si no se proporciona
let posicionDelSeparador = numeroComoCadena.indexOf(opciones.separadorDecimal);
if (posicionDelSeparador === -1) posicionDelSeparador = numeroComoCadena.length;
let formateadoSinDecimales = "", indice = posicionDelSeparador;
// Ir cortando desde la derecha de 3 en 3, y concatenar en una nueva cadena
while (indice >= 0) {
let limiteInferior = indice - CIFRAS_MILES;
// Agregar separador si cortamos más de 3
formateadoSinDecimales = (limiteInferior > 0 ? opciones.separadorMiles : "") + numeroComoCadena.substring(limiteInferior, indice) + formateadoSinDecimales;
indice -= CIFRAS_MILES;
}
let formateadoSinSimbolo = `${formateadoSinDecimales}${numeroComoCadena.substr(posicionDelSeparador, opciones.numeroDeDecimales + 1)}`;
return opciones.posicionSimbolo === "i" ? opciones.simbolo + formateadoSinSimbolo : formateadoSinSimbolo + opciones.simbolo;
};
// Probar
const opcionesPesosMexicanos = {
numeroDeDecimales: 2,
separadorDecimal: ".",
separadorMiles: ",",
simbolo: "$ ", // Con un espacio, ya que la función no agrega espacios
posicionSimbolo: "i", // i = izquierda, d = derecha
},
opcionesDolares = {
numeroDeDecimales: 2,
separadorDecimal: ".",
separadorMiles: ",",
simbolo: " USD", // Con un espacio, ya que la función no agrega espacios
posicionSimbolo: "d", // i = izquierda, d = derecha
};
const numeros = [1.652, 12, 123, 1234, 12345.335, 123456, 1234567, 12345678, 123456789, 1234567890, 12345678901, 123456789012, 586.512];
console.log("Probando con pesos...");
numeros.forEach(numero => console.log(`Con ${numero} sale ${aMoneda(numero, opcionesPesosMexicanos)}`));
console.log("Probando con dólares...");
numeros.forEach(numero => console.log(`Con ${numero} sale ${aMoneda(numero, opcionesDolares)}`));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment