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=&$digito(int($num / 1000)); if (defined($miles)) { if ($miles eq "uno") { $verb.="mil "; } else { $verb.="$miles mil "; } $num -= 1000 * int($num / 1000); } $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.="dieci".&$digito($unids); } else { $verb.="diez"; } $num-=$unids; } elsif ($decs==2) { $unids=int($num - 10 * int($num/10)); if ($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; $$;