Created
January 3, 2019 05:40
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 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