Skip to content

Instantly share code, notes, and snippets.

@blkdr
Last active March 4, 2023 16:09
Show Gist options
  • Save blkdr/a3aca384dd2fa002f6926b49752322cf to your computer and use it in GitHub Desktop.
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.
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;
}
};
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
*/
@jorgefilemon
Copy link

no esta mal decir 'un mil pesos' ? se dice mil pesos, o depende el pais? aqui en mexico se oye raro 'un mil pesos'

@inglesuniversal
Copy link

En México se maneja UN MIL PESOS para este caso particular $1,000

@jorgefilemon
Copy link

jorgefilemon commented Mar 4, 2023

ya investigué y se usa UN MIL para escribir cheques y así evitar anteponer un número y alterar el valor.

@inglesuniversal
Copy link

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