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 | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Es correcto 👍 por eso esta rutina la elegí para un generador de recibos en pesos mexicanos que estoy codificando