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éis ";
} 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 == 6) {
$verb.="veintiséis";
} 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;
$$;