| Portada | Monotemáticos | Secciones | Desarrolladores | Comunidad | Servicios | Servicios profesionales | RSS | ||||
18/11/04 - 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.
| Autoría, licencia y acciones sobre este artículo | ||||||
|
Informe de Marcelo Cortés*
Atención: Copyright. Este artículo no se puede reproducir sin la autorización expresa del autor. * Para consultas técnicas utilizar la lista de correo.
|
| Comentarios sin revisar |
| Entre los comentarios no revisados puede haber algunos interesantes que se hayan enviado recientemente. |
| Ver los comentarios no revisados |
| Añadir un comentario del artículo |
| Enlaces: |
| Maestrosdelweb |
|
||||
Tienda DesarrolloWeb