Last active
September 9, 2024 18:05
-
-
Save blkdr/a3aca384dd2fa002f6926b49752322cf to your computer and use it in GitHub Desktop.
Código en JavaScript que convierte números a letras. Basado en gist de ~alfchee con modificaciones.
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
const Unidades = num => { | |
switch (num) { | |
case 1: | |
return 'UN'; | |
case 2: | |
return 'DOS'; | |
case 3: | |
return 'TRES'; | |
case 4: | |
return 'CUATRO'; | |
case 5: | |
return 'CINCO'; | |
case 6: | |
return 'SEIS'; | |
case 7: | |
return 'SIETE'; | |
case 8: | |
return 'OCHO'; | |
case 9: | |
return 'NUEVE'; | |
default: | |
return ''; | |
} | |
}; | |
const Decenas = num => { | |
let decena = Math.floor(num / 10); | |
let unidad = num - (decena * 10); | |
switch (decena) { | |
case 1: | |
switch (unidad) { | |
case 0: | |
return 'DIEZ'; | |
case 1: | |
return 'ONCE'; | |
case 2: | |
return 'DOCE'; | |
case 3: | |
return 'TRECE'; | |
case 4: | |
return 'CATORCE'; | |
case 5: | |
return 'QUINCE'; | |
default: | |
return 'DIECI' + Unidades(unidad); | |
} | |
case 2: | |
switch (unidad) { | |
case 0: | |
return 'VEINTE'; | |
default: | |
return 'VEINTI' + Unidades(unidad); | |
} | |
case 3: | |
return DecenasY('TREINTA', unidad); | |
case 4: | |
return DecenasY('CUARENTA', unidad); | |
case 5: | |
return DecenasY('CINCUENTA', unidad); | |
case 6: | |
return DecenasY('SESENTA', unidad); | |
case 7: | |
return DecenasY('SETENTA', unidad); | |
case 8: | |
return DecenasY('OCHENTA', unidad); | |
case 9: | |
return DecenasY('NOVENTA', unidad); | |
case 0: | |
return Unidades(unidad); | |
} | |
}; | |
const DecenasY = (strSin, numUnidades) => numUnidades > 0 ? strSin + ' Y ' + Unidades(numUnidades) : strSin ; | |
const Centenas = num => { | |
let centenas = Math.floor(num / 100); | |
let decenas = num - (centenas * 100); | |
switch (centenas) { | |
case 1: | |
if (decenas > 0) | |
return 'CIENTO ' + Decenas(decenas); | |
return 'CIEN'; | |
case 2: | |
return 'DOSCIENTOS ' + Decenas(decenas); | |
case 3: | |
return 'TRESCIENTOS ' + Decenas(decenas); | |
case 4: | |
return 'CUATROCIENTOS ' + Decenas(decenas); | |
case 5: | |
return 'QUINIENTOS ' + Decenas(decenas); | |
case 6: | |
return 'SEISCIENTOS ' + Decenas(decenas); | |
case 7: | |
return 'SETECIENTOS ' + Decenas(decenas); | |
case 8: | |
return 'OCHOCIENTOS ' + Decenas(decenas); | |
case 9: | |
return 'NOVECIENTOS ' + Decenas(decenas); | |
default: | |
return Decenas(decenas); | |
} | |
}; | |
const Seccion = (num, divisor, strSingular, strPlural) => { | |
let cientos = Math.floor(num / divisor) | |
let resto = num - (cientos * divisor) | |
let letras = ''; | |
if (cientos > 0) { | |
letras = cientos > 1 ? Centenas(cientos) + ' ' + strPlural : strSingular; | |
} else { | |
letras = strSingular; | |
} | |
if (resto > 0) { | |
letras += ''; | |
} | |
return letras; | |
}; | |
const Miles = num => { | |
let divisor = 1000; | |
let cientos = Math.floor(num / divisor) | |
let resto = num - (cientos * divisor) | |
let strMiles = Seccion(num, divisor, 'UN MIL', 'MIL'); | |
let strCentenas = Centenas(resto); | |
return strMiles == '' || cientos === 0 ? strCentenas : strMiles + ' ' + strCentenas ; | |
}; | |
const Millones = num => { | |
let divisor = 1000000; | |
let cientos = Math.floor(num / divisor) | |
let resto = num - (cientos * divisor) | |
let strMillones = Seccion(num, divisor, millon(num, true), millon(num, false)); | |
let strMiles = Miles(resto); | |
return strMillones == '' || cientos === 0 ? strMiles : strMillones + ' ' + strMiles ; | |
}; | |
const millon = (num, singular) => { | |
let letraMillon = singular ? 'UN MILLON' : 'MILLONES'; | |
if (num % 1000000 == 0) { | |
letraMillon = letraMillon + ' DE' | |
} | |
return letraMillon; | |
}; | |
export const NumberAsString = (num, centavos = false, currency) => { | |
currency = currency || {}; | |
let data = { | |
numero: num, | |
enteros: Math.floor(num), | |
centavos: centavos ? (((Math.round(num * 100)) - (Math.floor(num) * 100))) : 0, | |
letrasCentavos: '', | |
letrasMonedaPlural: currency.plural || 'PESOS', | |
letrasMonedaSingular: currency.singular || 'PESO', | |
letrasMonedaCentavoPlural: currency.centPlural || 'CENTAVOS', | |
letrasMonedaCentavoSingular: currency.centSingular || 'CENTAVO' | |
}; | |
if (data.centavos > 0) { | |
let centavos = data.centavos == 1 ? Millones(data.centavos) + ' ' + data.letrasMonedaCentavoSingular : Millones(data.centavos) + ' ' + data.letrasMonedaCentavoPlural ; | |
data.letrasCentavos = 'CON ' + centavos; | |
} | |
if (data.enteros == 0) { | |
return 'CERO ' + data.letrasMonedaPlural + ' ' + data.letrasCentavos; | |
} | |
if (data.enteros == 1) { | |
return Millones(data.enteros) + ' ' + data.letrasMonedaSingular + ' ' + data.letrasCentavos; | |
} else { | |
return Millones(data.enteros) + ' ' + data.letrasMonedaPlural + ' ' + data.letrasCentavos; | |
} | |
}; |
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
import { NumberAsString } from './NumberAsString.js'; | |
const addCommas = (value = 0, fixed = 0) => value.toFixed(fixed).replace(/./g, (c, i, a) => { | |
return i && c !== '.' && ((a.length - i) % 3) === 0 ? ',' + c : c; | |
}); | |
const testing = [ | |
7, | |
17, | |
997, | |
1007, | |
2017, | |
2917, | |
37093, | |
527465, | |
1001017, | |
9117942 | |
]; | |
testing.map(cantidad => { | |
console.log('-----------------------'); | |
console.log(addCommas(cantidad)); | |
console.log(NumberAsString(cantidad)); | |
}); | |
/* | |
----------------------- | |
7 | |
SIETE PESOS | |
----------------------- | |
17 | |
DIECISIETE PESOS | |
----------------------- | |
997 | |
NOVECIENTOS NOVENTA Y SIETE PESOS | |
----------------------- | |
1,007 | |
UN MIL SIETE PESOS | |
----------------------- | |
2,017 | |
DOS MIL DIECISIETE PESOS | |
----------------------- | |
2,917 | |
DOS MIL NOVECIENTOS DIECISIETE PESOS | |
----------------------- | |
37,093 | |
TREINTA Y SIETE MIL NOVENTA Y TRES PESOS | |
----------------------- | |
527,465 | |
QUINIENTOS VEINTISIETE MIL CUATROCIENTOS SESENTA Y CINCO PESOS | |
----------------------- | |
1,001,017 | |
UN MILLON UN MIL DIECISIETE PESOS | |
----------------------- | |
9,117,942 | |
NUEVE MILLONES CIENTO DIECISIETE MIL NOVECIENTOS CUARENTA Y DOS PESOS | |
*/ |
No funciona para miles de millones
no esta mal decir 'un mil pesos' ? se dice mil pesos, o depende el pais? aqui en mexico se oye raro 'un mil pesos'
En México se maneja UN MIL PESOS para este caso particular $1,000
ya investigué y se usa UN MIL para escribir cheques y así evitar anteponer un número y alterar el valor.
Es correcto 👍 por eso esta rutina la elegí para un generador de recibos en pesos mexicanos que estoy codificando
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Original/Source
https://gist.github.com/alfchee/e563340276f89b22042a