2010-06-26 26 views
6

Tengo una tabla con 3 columnas:formato de doble precisión en PostgreSQL

customer_name varchar 
,account_type varchar 
,current_balance double precision 

Valores de ejemplo para current_balance:

 
1200 
1500.5 
1500 

quiero que se muestran así:

 
1200.00 
1500.50 
1500.00 

Intenté la siguiente consulta:

SELECT to_char(current_balance,'9999999999999999D99') 
    FROM bank; 

Formatea de la manera que yo quiero pero agrega un espacio al principio. ¿Cómo resolver esto? ¿Hay una mejor manera de formatear?

+8

Detente justo donde estás. Con cuidado [lea la sección sobre cómo se tratan los dobles en Postgres] (http://www.postgresql.org/docs/8.4/interactive/datatype-numeric.html#DATATYPE-FLOAT). Los dobles se tratan como valores de coma flotante. Los flotadores se almacenan y calculan de tal manera que pueden perder precisión. No use un valor de coma flotante para almacenar un valor monetario. Use los tipos 'NUMERIC' o' DECIMAL'. – Charles

Respuesta

6

Puede utilizar trim para eliminar los espacios adicionales. Sin argumentos, elimina solo espacios.

charles=# SELECT to_char(12345.67,'99999999999999999D99'); 
     to_char 
----------------------- 
       12345.67 
(1 row) 

charles=# SELECT trim(to_char(12345.67,'99999999999999999D99')); 
    btrim 
---------- 
12345.67 
(1 row) 
+0

hi Charles ... si mi registro de entrada es 0 (cero) ese tiempo solo da .00. pero quiero 0.00 ¿cómo puedo hacer esto ...? – ungalnanban

+0

No lo sé, en realidad. Todavía estoy aprendiendo todos los pormenores de Postgres. Si todo lo demás falla, puedes probar con un 'CASE' que verifica si el número es cero, y devuelve '0.00' si es así. – Charles

+2

Tarde para la fiesta, pero alguien debería mencionar '99 ... 0D99 'como una posible solución al requisito de 0.00. – VoiceOfUnreason

2
to_char(current_balance, 'FM9999999999999999D99') 

De the docs:

FM: modo de relleno prefijo (suprima el relleno espacios en blanco y ceros)

Si quieres un símbolo de moneda específico de la localidad, intente L:

to_char(current_balance, 'FML9999999999999999D99') 

L: símbolo de moneda (utiliza locale)

Los resultados de PG 8.4 contra columna llamada dbl con valor de 12,345.678 donde id = 1:

>>> import psycopg2 
>>> conn = psycopg2.connect(host='localhost', database='scratch', user='',password='') 
>>> c = conn.cursor() 

>>> c.execute("select to_char(dbl, '9999999999999999D99') from practice where id = 1;") 
>>> c.fetchall() # with padding 
[('   12345.68',)] 

>>> c.execute("select to_char(dbl, 'FM9999999999999999D99') from practice where id = 1;") 
>>> c.fetchall() # no padding 
[('12345.68',)] 

>>> c.execute("select to_char(dbl, 'FML9999999999999999D99') from practice where id = 1;") 
>>> c.fetchall() # with locale-specific currency symbol 
[('$12345.68',)] 
+0

no está dando formiato incorrecto. – ungalnanban

6

Como ya se ha señalado en un comentario, it's bad design to use a floating point type (real, double, float) for a money balance. Esto te llevará a problemas. Use DECIMAL en su lugar.

+0

Ok gracias ... Anoto sus puntos y aquí después usaré el decimal. – ungalnanban

+0

@ungalnanban: Esto tiene que ver con errores de redondeo cuando no usa decimal, por lo que es mejor que lo haga, porque si las sumas contables son incorrectas, cualquier conversión de flotante a cadena será su problema menor ... –

Cuestiones relacionadas