Re: cash_words en español?

2019-08-19 Thread roiman ramos
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?

2019-08-19 Thread Juan José Santamaría Flecha
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?

2019-08-19 Thread Alvaro Herrera
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?

2019-08-19 Thread Alvaro Herrera
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?

2019-08-19 Thread kernel





Gracias, ya tengo algún ejemplo que adaptar.







Re: cash_words en español?

2019-08-19 Thread Anthony Sotolongo
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

2019-08-19 Thread kernel



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?

2019-08-19 Thread kernel



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?

2019-08-19 Thread Juan José Santamaría Flecha
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?

2019-08-19 Thread kernel

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