Pasar de números a palabras es una tarea bastante sencilla. En esta entrada vamos a ver los cardinales y dejaremos los ordinales para otra.
Los números en castellano repiten la forma de nombrarse cada tres dígitos: Unidades, decenas, centenas. Si sabes decir los números del 0 al 999 sabes decir todos los demás sólo hay que añadir detrás el valor correspondiente: mil, millón, billón, trillón,… Hay que recordar que en español el mil se repite entre millón, billón, trillón,…
Cómo la forma se repiten el primer paso será separar el número en bloques de tres dígitos y escribir su valor correspondiente. En español hay dos maneras válidas de componer el texto que representa a estos tres dígitos:
centenas + » «+decenas+»i»+unidades
centenas + » «+decenas+» y «+unidades
Nosotros usaremos la segunda por ser la más frecuente. Aunque los números menores de 30 se realizan con la primera forma.
Centenas:
100 | ciento * |
200 | doscientos * |
300 | trescientos * |
400 | cuatrocientos * |
500 | quinientos * |
600 | seiscientos * |
700 | setecientos * |
800 | ochocientos * |
900 | novecientos * |
Decenas:
10 | dieci* |
20 | veinti* |
30 | treinta y * |
40 | cuarenta y * |
50 | cincuenta y * |
60 | sesenta y * |
70 | setenta y * |
80 | ochenta y * |
90 | noventa y * |
Unidades:
1 | uno |
2 | dos |
3 | tres |
4 | cuatro |
5 | cinco |
6 | seis |
7 | siete |
8 | ocho |
9 | nueve |
Excepciones:
0 | cero |
10 | diez |
11 | once |
12 | doce |
13 | trece |
14 | catorce |
15 | quince |
20 | veinte |
100 | cien |
Con esto ya podemos decir todos los números. Cada tres números hay que añadir un indicador de valor:
*.000 | * mil |
*.000.000 | * millones |
*.000.000.000 | * mil (millones) |
*.000.000.000.000 | * billones |
*.000.000.000.000.000 | * mil (billones) |
*.000.000.000.000.000.000 | * trillones |
Aquí nos encontramos con las excepciones cuando X es 1
1.000 | mil |
1.000.000 | un millón |
1.000.000.000 | mil millones |
1.000.000.000.000 | un billón |
1.000.000.000.000.000 | mil billones |
1.000.000.000.000.000.000 | un trillón |
Parece muy complicado pero son unas pocas reglas muy sencillas de codificar.
De palabras a número
Como acabamos de ver nuestro sistema de nombrar los números se basa en repetir bloques de tres números y añadir un modificador de valor (miles, millones,…). El proceso de transformar texto a número consiste en:
- iniciar la variable number a 0
- ver si el texto empieza por alguna de las palabras de las tablas anteriores
-
- Si la palabra representa centenas, decena o unidades se sumar el valor correspondiente a number.
- Si la palabra es un modificador de valor se multiplica por el valor que representa
- eliminar palabras encontrado del principio del texto
- volver al punto 2 hasta que se termine el texto o no se encuentren coincidencias
Antes de tratar el texto y para facilitarnos el procesado pasamos el texto a minúsculas, eliminamos de la cadena, las tildes, espacios y reemplazamos las «y» por «i».
«Veintidós mil trecientos quince»
Primero tratamos la cadena;
«veintidosmiltrecientosquince»
Buscamos la primera coincidencia
veinti -> number +20
dos -> number +2
mil -> number *1000
trescientos -> number +300
quince -> number +15
number = 22315
Podéis ver le código aquí.
De número a palabras
Para hacer el paso de número a palabras hay que dividir el numero en bloques de tres dígitos y tratar cada uno de forma independiente usando las tablas del principio
123456
123 – «ciento» + «veinti» + «tres»
456 – «cuatrocientos» + «cincuenta» + «y» + «seis»
Añadimos el modificador de valor correspondiente
«ciento veintitres» + «mil»
«cuatrocientos cincuenta y seis»
Unimos las cadenas:
«ciento veintitres mil» + «cuatrocientos cincuenta y seis»
Resultado:
ciento veintitres mil cuatrocientos cincuenta y seis
Queda un último paso que es reemplazar las excepciones, por ejemplo «uno mil» por «mil» o «veintitres» por «veintitrés» (como en este caso):
ciento veintitrés mil cuatrocientos cincuenta y seis
El código aquí.
Género
¿Género? Si, algunos valores pueden tener género y son casos que hay que tener en cuenta. En concreto las centenas y la terminación «uno».
doscientas, trescientas, cuatrocientas, una, veintiuna, …
Decimales
Cuando hay decimales se indica con el separador: «coma», «punto», «con» y se lee el número decimal como si fuera otro número. Cumplen las mismas reglas, a excepción de que son femeninos. Si no se pone indicador de valor significa que es el número leído desde la coma.
«Con tres milésimas» = ,003
«Con tres» = ,3
Para los decimales el texto se separa en dos partes, la entera y la decimal, y se procesan por separado. La parte decimal se procesa igual que la entera. Pero al final hay que añadirle las unidades, que dependerán del número de dígitos.
0,0X | décimas |
0,0X | centésimas |
0,00X | milésimas |
0,00000X | millonésima |
Es importante tener en cuenta que los primeros números pueden ser ceros que no afectan a la forma de escribirlo, pero si al valor que se añade al final:
,3 = «tres décimas»
,03 = «tres centésimas»
,003 = «tres milésimas»
Cómo JavaScript es tan «particular» con los decimales se ha optado por usar dos enteros, uno representa la parte decimal y otro el número por el que hay que dividirla.
No sólo números
En los números no sólo hay números, hay otros símbolos a tener en cuenta. Separadores de miles, separador decimal, símbolo de menos, monedas, unidades, símbolo de %.