Re: cash_words en español?
Aquí hay algo que te puede ayudar... http://roy-rc.blogspot.com/2010/08/postgresql-funcion-que-convierte-un.html?m=0 El lun., 19 de agosto de 2019 7:09 a. m., kernel escribió: > > El 19/08/2019 a las 13:05, Juan José Santamaría Flecha escribió: > > On Mon, Aug 19, 2019 at 12:16 PM kernel wrote: > >> ¿hay algún sitio donde encontrar documentacion de este tipo de > >> funciones? , me gustaría saber si puedo utilizar la función cash_words > >> con salida en español > >> > > La función cash_words() tiene como entrada datos del tipo 'money', por > > lo general trabajar con este tipo de datos suele ser una mala idea: > > > > https://wiki.postgresql.org/wiki/Don't_Do_This#Don.27t_use_money > > > > De hecho esta función debió quedarse obsoleta en algún momento, por lo > > que no está documentada. Así que si quieres una funcionalidad de este > > tipo seguramente tengas que hacerte una función propia. > > > > Un saludo, > > > > Juan José Santamaría Flecha > > > ok, gracias > > > >
Re: cash_words en español?
On Mon, Aug 19, 2019 at 6:31 PM Alvaro Herrera wrote: > > 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. > Entre el ejemplo del wiki y el código Perl parece sencillo de ajustar a PL/pgSQL. Adjunto un ejemplo. Un saludo Juan José Santamaría Flecha numero_a_texto.sql Description: Binary data
Re: cash_words en español?
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 Herrerahttps://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; $$;
Re: cash_words en español?
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 Herrerahttps://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; $$;
Re: cash_words en español?
Gracias, ya tengo algún ejemplo que adaptar.
Re: cash_words en español?
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 ;-) Saludos El 19-08-19 a las 07:05, Juan José Santamaría Flecha escribió: On Mon, Aug 19, 2019 at 12:16 PM kernel wrote: ¿hay algún sitio donde encontrar documentacion de este tipo de funciones? , me gustaría saber si puedo utilizar la función cash_words con salida en español La función cash_words() tiene como entrada datos del tipo 'money', por lo general trabajar con este tipo de datos suele ser una mala idea: https://wiki.postgresql.org/wiki/Don't_Do_This#Don.27t_use_money De hecho esta función debió quedarse obsoleta en algún momento, por lo que no está documentada. Así que si quieres una funcionalidad de este tipo seguramente tengas que hacerte una función propia. Un saludo, Juan José Santamaría Flecha
Re: Problemas de tamaño/recodificacion
El 16/08/2019 a las 20:27, Alvaro Herrera escribió: kernel escribió: Lo del parche a mi se me queda un poco grande, no tengo experiencia en esos temas Pude reproducir tu problema y el parche que propuse antes casi lo soluciona; mandé un parche más completo a hackers a ver si lo podemos incluir en futuras versiones: https://www.postgresql.org/message-id/flat/20190816181418.GA898@alvherre.pgsql La siguiente consulta reproduce el problema: select query_to_xml( 'select a, cash_words(a::text::money) from generate_series(0, 200) a', true, false, ''); si tienes un client_encoding distinto del server_encoding, esa consulta muere con el error que antes dijiste: ERROR: memoria agotada DETALLE: La cadena de 281409059 bytes es demasiado larga para la recodificaci�n. Duración: 14830,015 ms (00:14,830) (ojo con el error de codificación ahí .. mi terminal es utf8 y la salida es latin9) ok , gracias
Re: cash_words en español?
El 19/08/2019 a las 13:05, Juan José Santamaría Flecha escribió: On Mon, Aug 19, 2019 at 12:16 PM kernel wrote: ¿hay algún sitio donde encontrar documentacion de este tipo de funciones? , me gustaría saber si puedo utilizar la función cash_words con salida en español La función cash_words() tiene como entrada datos del tipo 'money', por lo general trabajar con este tipo de datos suele ser una mala idea: https://wiki.postgresql.org/wiki/Don't_Do_This#Don.27t_use_money De hecho esta función debió quedarse obsoleta en algún momento, por lo que no está documentada. Así que si quieres una funcionalidad de este tipo seguramente tengas que hacerte una función propia. Un saludo, Juan José Santamaría Flecha ok, gracias
Re: cash_words en español?
On Mon, Aug 19, 2019 at 12:16 PM kernel wrote: > > ¿hay algún sitio donde encontrar documentacion de este tipo de > funciones? , me gustaría saber si puedo utilizar la función cash_words > con salida en español > La función cash_words() tiene como entrada datos del tipo 'money', por lo general trabajar con este tipo de datos suele ser una mala idea: https://wiki.postgresql.org/wiki/Don't_Do_This#Don.27t_use_money De hecho esta función debió quedarse obsoleta en algún momento, por lo que no está documentada. Así que si quieres una funcionalidad de este tipo seguramente tengas que hacerte una función propia. Un saludo, Juan José Santamaría Flecha
cash_words en español?
Hola, Acabo de descubrir la función cash_words, estoy buscando documentacion pero no encuentro nada, veo que esta dentro del pg_catalog (junto con otro montón que desconozco su funcionamiento) ¿hay algún sitio donde encontrar documentacion de este tipo de funciones? , me gustaría saber si puedo utilizar la función cash_words con salida en español Gracias