[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