Transformar números con dígitos a palabras

Valoración del artículo:
Script Perl con el que podemos pasar de un numero, escrito con dígitos, al mismo número, escrito con palabras.
Publicado: 18/11/04
Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.
Podemos ver en este artículo un ejemplo de código realizado en Perl. Sirve para convertir números, escritos con dígitos, en números escritos con palabras. El ejercicio en si no está muy explicado. No obstante, disponemos de ciertos comentarios en el código que pueden ayudarnos a entenderlo mejor.

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.

Comentarios
Fueron enviados 6 comentarios al artículo
6 comentarios no revisados
0 comentarios revisados

Categorias relacionadas
El autor
Últimas noticias
Alojados en el grupo