sub conv_num_a_pal {
# Recibe numero real positivo de la forma:
# 12345.5678
# y lo devuelve en palabras:
# doce mil trescientos cuarenta y cinco coma cinco seis siete ocho.
# Los decimales los transforma a la palabra correspondiente de cada digito y no usa unidades de mil, centenas ni decenas.
my ($num) = $_[0];
my ($num_aux, $pal, @unid, @dec, @cent, $resul, $i, @decimas);
my ($dig, $entero, $centavos, $num_bloques, $primer_dig, $segundo_dig, $tercer_dig, $bloque, $bloque_cero);
@unid = ('cero', 'uno', 'dos','tres', 'cuatro', 'cinco', 'seis', 'siete', 'ocho', 'nueve', 'diez', 'once', 'doce', 'trece', 'catorce' , 'quince' , 'dieciseis' , 'diecisiete' , 'dieciocho' , 'diecinueve', 'veinte', 'ventiun', 'veintidos', 'veintitres', 'veinticuatro', 'veinticinco', 'veintiseis', 'veintisiete', 'veintiocho', 'veintinueve');
@dec = ('', 'diez', 'veinte', 'treinta', 'cuarenta', 'cincuenta', 'sesenta', 'setenta', 'ochenta', 'noventa');
@cent = ('', 'ciento', 'doscientos', 'trescientos', 'cuatrocientos', 'quinientos', 'seiscientos', 'setecientos', 'ochocientos', 'novecientos');
$num_aux = $num;
$entero = int($num_aux);
$centavos = $num_aux;
$centavos =~ s/^\d+.//s;
$resul = 'cero' if $entero == 0;
$num_bloques = 1;
while ($entero > 0) {
$primer_dig = 0;
$segundo_dig = 0;
$tercer_dig = 0;
$bloque = '';
$bloque_cero = 0;
$i = 0;
for (1..3) {
$i++;
$dig = $entero - (int($entero / 10) * 10);
if ($dig != 0) {
if ($i == 1) {
$bloque = ' ' . $unid[$dig];
$primer_dig = $dig;
}
elsif ($i == 2) {
if ($dig <= 2) {
$bloque = ' ' . $unid[$dig * 10 + $primer_dig];
}
else {
$bloque = ' ' . $dec[$dig] . ($primer_dig != 0 ? ' y' : '') . $bloque;
};
$segundo_dig = $dig;
}
elsif ($i == 3) {
$bloque = ' ' . (($dig == 1 and $primer_dig == 0 and $segundo_dig == 0) ? 'cien' : $cent[$dig]) . $bloque;
$tercer_dig = $dig;
};
}
else {
$bloque_cero++;
};
$entero = int($entero / 10);
last if $entero == 0;
};
if ($num_bloques == 1) {
$resul = $bloque;
}
elsif ($num_bloques == 2) {
$resul = $bloque . ($bloque_cero != 3 ? ' mil' : '') . $resul;
}
elsif ($num_bloques == 3) {
$resul = $bloque . (($primer_dig == 1 and $segundo_dig == 0 and $tercer_dig == 0) ? ' millón' : ' millones') . $resul;
}
elsif ($num_bloques == 4) {
$resul = $bloque . ($bloque_cero != 3 ? ' mil' : '') . $resul;
}
elsif ($num_bloques == 5) {
$resul = $bloque . (($primer_dig == 1 and $segundo_dig == 0 and $tercer_dig == 0) ? ' billón' : ' billones') . $resul;
};
$num_bloques++;
};
$resul = &trim($resul);
if ($centavos ne '') {
$resul .= ' coma ';
$centavos = 0 if $centavos == 0;
@decimas = split('', $centavos);
for ($i = 0; $#decimas >= $i; $i++) {
$resul .= $unid[$decimas[$i]] . ' ';
};
};
return &trim($resul);
}; # conv_num_a_pal.
# ----------------------------------------------------
sub trim {
my $valor = $_[0];
$valor =~ s/^\s*//;
$valor =~ s/\s*$//;
return $valor;
}; # trim.