[Perl] Rutina de conversion..
Gunnar Wolf
gwolf@campus.iztacala.unam.mx
Sun, 19 May 2002 17:22:53 -0500 (CDT)
> Alguien sabe de alguna rutina o modulo en Perl para convertir cantidades
> numericas a su expresion en letra..?
Ah=ED te va la m=EDa. Probablemente exista alg=FAn m=F3dulo, probablemente =
puedas
hacerlo mejor, pero... Se me hizo un trabajo m=E1s simple de reimplementar
que de buscar en el momento que lo hice.
sub cantidad {
# Recibe una cantidad y la regresa convertida a la cadena equivalente e=
n
# espa=F1ol. Regresa como segundo valor la parte fraccional.
# Manejamos hasta centenas de millones.
my ($num, $cadena, $pos, $cent, %t);
$num =3D shift;
return ('cero','00') if $num=3D=3D0;
$cadena =3D '';
$pos =3D 0;
%t =3D ('unidad' =3D> [qw(cero un dos tres cuatro cinco seis siete ocho=
nueve)],
=09 'decena' =3D> ['', qw(diez veinte treinta cuarenta cincuenta sesenta s=
etenta ochenta noventa)],
=09 'centena' =3D> ['',qw(cien doscientos trescientos cuatrocientos quinie=
ntos seiscientos setecientos ochocientos novecientos)],
=09 # casitos especiales...
=09 'dieces' =3D> [qw(diez once doce trece catorce quince dieciseis diecis=
iete dieciocho diecinueve)] );
# Que sea un n=FAmero v=E1lido, o no lo procesamos
return undef unless $num =3D~ /^\d+(\.\d+)?/;
$num =3D~ s/\.(\d+)//;
$cent =3D $1;
while ($num) {
=09$pos++;
=09my $digito =3D chop($num);
=09if ($pos =3D=3D 1 or $pos =3D=3D 4 or $pos =3D=3D 7) {
=09 if (substr($num,-1,1) =3D=3D 1) {
=09=09$cadena =3D "$t{dieces}[$digito] $cadena";
=09=09chop $num;
=09=09$pos++;
=09 } else {
=09=09$cadena =3D "$t{unidad}[$digito] $cadena";
=09=09$cadena =3D "y $cadena" if substr($num,-1,1);
=09 }
=09} elsif ($pos =3D=3D 2 or $pos =3D=3D 5 or $pos =3D=3D 8) {
=09 $cadena =3D "$t{decena}[$digito] $cadena";
=09} elsif ($pos =3D=3D 3 or $pos =3D=3D 6 or $pos =3D=3D 9) {
=09 $cadena =3D "$t{centena}[$digito] $cadena";
=09 $cadena =3D "mil $cadena" if (($pos =3D=3D 3 or $pos =3D=3D 9) and (=
substr($num,-1,1) or substr($num,-2,1) or substr($num,-3,1)));
=09 $cadena =3D "millones $cadena" if ($pos =3D=3D 6 and (substr($num,-1=
,1) or substr($num,-2,1) or substr($num,-3,1)));
=09} else {
=09 # No entiendo... Probablemente est=E9 fuera de rango.
=09 # Mejor regresar undef a regresar algo falso.
=09 return undef;
=09}
}
return ($cadena,sprintf('%02d',$cent));
}
--=20
Gunnar Wolf - gwolf@campus.iztacala.unam.mx - (+52-55)5623-1118
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF