Convertir de números a palabras. Cardinales

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:

  1. iniciar la variable number a 0
  2. ver si el texto empieza por alguna de las palabras de las tablas anteriores
    1. Si la palabra representa centenas, decena o unidades se sumar el valor correspondiente a number.
    2. Si la palabra es un modificador de valor se multiplica por el valor que representa
  3. eliminar palabras encontrado del principio del texto
  4. 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 %.