Anthony Sotolongo escribió:
> Hola, y para hacerte un función propia tal vez te ayuden estas que están en
> ingles:
> 
> https://wiki.postgresql.org/wiki/Integer_to_Text
> 
> https://wiki.postgresql.org/wiki/Numeric_to_English
> 
> y si las ajustas al español, compártelas ;-)

Escribí una hace años en plperl ... acá está.  No me gusta tanto porque
uno de los casos recursivos pasa a través de SPI ... sería mejor tener
una referencia a código (como el sub $digito) pero por alguna razón
nunca hice esa modificación.

Tampoco maneja millones, pero debería ser muy fácil agregarlo.

A lo mejor a alguien le puede servir esto.

-- 
Álvaro Herrera                https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
create or replace function num2pal(numeric) returns text
strict immutable language plperl as $$
        my $num = shift;
        my $verb="";
        my $digito = sub {
                if ($_[0] == 1) {
                        return "uno";
                } elsif ($_[0] == 2) {
                        return "dos";
                } elsif ($_[0] == 3) {
                        return "tres";
                } elsif ($_[0] == 4) {
                        return "cuatro";
                } elsif ($_[0] == 5) {
                        return "cinco";
                } elsif ($_[0] == 6) {
                        return "seis";
                } elsif ($_[0] == 7) {
                        return "siete";
                } elsif ($_[0] == 8) {
                        return "ocho";
                } elsif ($_[0] == 9) {
                        return "nueve";
                }
                return undef;
        };

        my ($miles, $cents, $decs, $unids);

        $miles=int($num / 1000);
        if ($miles == 1) {
                $verb.= "mil ";
        } elsif ($miles > 1) {
                my $res = spi_exec_query("SELECT num2pal($miles)");
                $verb .= $res->{rows}[0]->{num2pal} . " mil ";
        }
        $num -= 1000 * $miles;

        $cents=&$digito(int($num / 100));
        if (defined($cents)) {
                if ($cents eq "uno") {
                        if (int($num) - int($num / 100) > 0) {
                                $verb.="ciento ";
                        } else {
                                $verb.="cien ";
                        }
                } elsif ($cents eq "cinco") {
                        $verb.="quinientos ";
                } elsif ($cents eq "siete") {
                        $verb.="setecientos ";
                } elsif ($cents eq "nueve") {
                        $verb.="novecientos ";
                } else {
                        $verb.="${cents}cientos ";
                }
                $num -= 100 * int($num / 100);
        }

        $decs=int($num / 10);
        if ($decs==1) {
                $unids=int($num - 10 * int($num/10));
                if ($unids == 1) {
                        $verb.="once ";
                } elsif ($unids == 2) {
                        $verb.="doce ";
                } elsif ($unids == 3) {
                        $verb.="trece ";
                } elsif ($unids == 4) {
                        $verb.="catorce ";
                } elsif ($unids == 5) {
                        $verb.="quince ";
                } elsif ($unids == 6) {
                        $verb.="diecisés ";
                } elsif ($unids > 6) {
                        $verb.="dieci".&$digito($unids);
                } else {
                        $verb.="diez";
                }
                $num-=$unids;
        } elsif ($decs==2) {
                $unids=int($num - 10 * int($num/10));
                if ($unids == 2) {
                        $verb.="veintidós";
                } elsif ($unids == 3) {
                        $verb.="veintitrés";
                } elsif ($unids>0) {
                        $verb.="veinti".&$digito($unids);
                } else {
                        $verb.="veinte";
                }
                $num-=$unids;
        } elsif ($decs==3) {
                $verb.="treinta ";
        } elsif ($decs==4) {
                $verb.="cuarenta ";
        } elsif ($decs==5) {
                $verb.="cincuenta ";
        } elsif ($decs==6) {
                $verb.="sesenta ";
        } elsif ($decs==7) {
                $verb.="setenta ";
        } elsif ($decs==8) {
                $verb.="ochenta ";
        } elsif ($decs==9) {
                $verb.="noventa ";
        }
        if ($decs>=2 && ($num - 10 * int($num/10) > 0)) {
                $verb.="y ";
        }
        $num -= 10 * int($num / 10);

        $unids=&$digito(int($num));
        $verb.="".($unids || "")." ";
        $num -= int($num);

        if ($num > 0) {
                $verb .= "coma " . ($num);
        }
        $verb =~ s/ *$//;
        return $verb;
$$;

Reply via email to