2010-06-26 14 views
6

Ho una tabella con 3 colonne:Formato doppia precisione in PostgreSQL

customer_name varchar 
,account_type varchar 
,current_balance double precision 

Valori di esempio per current_balance:

 
1200 
1500.5 
1500 

voglio loro di visualizzare in questo modo:

 
1200.00 
1500.50 
1500.00 

Ho provato la seguente domanda:

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

Formatta nel modo desiderato ma aggiunge uno spazio all'inizio. Come risolvere questo? C'è un modo migliore per formattare?

+8

Fermati proprio dove ti trovi. Con attenzione [leggi la sezione su come vengono trattati i doppi in Postgres] (http://www.postgresql.org/docs/8.4/interactive/datatype-numeric.html#DATATYPE-FLOAT). I doppi sono trattati come valori in virgola mobile. I galleggianti sono memorizzati e calcolati in modo tale da poter perdere precisione. Non utilizzare un valore in virgola mobile per memorizzare un valore monetario. Usa i tipi 'NUMERIC' o' DECIMAL'. – Charles

risposta

6

È possibile utilizzare trim per rimuovere gli spazi aggiuntivi. Senza argomenti, rimuove solo gli spazi.

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 .. se il mio record di input è 0 (zero) quella volta dà solo 00. ma voglio 0.00 come posso fare questo ..? – ungalnanban

+0

Non lo so, in realtà. Sto ancora imparando tutti i dettagli di Postgres. Se tutto il resto fallisce, puoi provare un 'CASE' che verifica se il numero è zero, e restituisce '0.00' in caso affermativo. – Charles

+2

In ritardo alla festa, ma qualcuno dovrebbe probabilmente menzionare '99 ... 0D99 'come una possibile soluzione al requisito di 0,00. – VoiceOfUnreason

2
to_char(current_balance, 'FM9999999999999999D99') 

Da the docs:

FM: modalità di riempimento del prefisso (sopprimere imbottitura spazi vuoti e zeri)

Se si desidera un simbolo di valuta specifica locale, provare L:

to_char(current_balance, 'FML9999999999999999D99') 

L: simbolo di valuta (usa locale)

I risultati di PG 8.4 contro colonna chiamata dbl con un valore di 12.345,678 dove 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, sta dando un formatto sbagliato. – ungalnanban

6

Come già sottolineato in un commento, it's bad design to use a floating point type (real, double, float) for a money balance. Questo ti porterà a problemi. Utilizzare invece DECIMAL.

+0

Ok grazie ... Annoto i tuoi punti e qui dopo userò i decimali. – ungalnanban

+0

@ungalnanban: questo ha a che fare con errori di arrotondamento quando non si utilizza il decimale, quindi è meglio farlo, perché se le somme contabili sono sbagliate, qualsiasi conversione da float a stringa sarà il problema minore ... –

Problemi correlati