2010-06-26 13 views
6

Mam tabeli z 3 kolumny:format podwójnej precyzji w PostgreSQL

customer_name varchar 
,account_type varchar 
,current_balance double precision 

Przykładowe wartości dla current_balance:

 
1200 
1500.5 
1500 

chcę, żeby wyświetlić tak:

 
1200.00 
1500.50 
1500.00 

Wypróbowałem następujące zapytanie:

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

Formatuje tak, jak chcę, ale dodaje spację na początku. Jak rozwiązać ten problem? Czy istnieje lepszy sposób formatowania?

+8

Zatrzymaj się tam, gdzie jesteś. Ostrożnie [przeczytaj rozdział o tym, jak traktuje się duble w Postgresie] (http://www.postgresql.org/docs/8.4/interactive/datatype-numeric.html#DATATYPE-FLOAT). Podwójne są traktowane jako wartości zmiennoprzecinkowe. Pływaki są przechowywane i obliczane w taki sposób, że mogą stracić precyzję. Nie używaj wartości zmiennoprzecinkowej do przechowywania wartości pieniężnej. Użyj typów 'NUMERIC' lub' DECIMAL'. – Charles

Odpowiedz

6

można wykorzystywać trim usunąć dodatkowe przestrzenie. Bez argumentów usuwa tylko spacje.

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

cześć Charles .. jeśli mój rekord wejściowy wynosi 0 (zero), tym razem daje on tylko 0,00. ale chcę 0.00, jak mogę to zrobić ..? – ungalnanban

+0

Nie wiem, właściwie. Nadal uczę się wszystkich tajników Postgres. Jeśli wszystko inne zawiedzie, możesz wypróbować "CASE", które sprawdza, czy liczba wynosi zero, i zwraca "0.00", jeśli tak. – Charles

+2

Późno na imprezę, ale ktoś powinien prawdopodobnie wspomnieć '99 ... 0D99 'jako możliwe rozwiązanie dla wymagania 0.00. – VoiceOfUnreason

2
to_char(current_balance, 'FM9999999999999999D99') 

Od the docs:

FM: tryb prefiks Fill (tłumić wyściółka spacje i zera)

Jeśli chcesz lokalizacji specyficzny symbol waluty, spróbuj L:

to_char(current_balance, 'FML9999999999999999D99') 

L: symbol waluty (wykorzystuje lokalizację)

Wyniki PG 8,4 przed kolumną o nazwie dbl o wartości 12345.678 gdzie 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

brak podania błędnego miana. – ungalnanban

6

Jak już wspomniano w komentarzu, it's bad design to use a floating point type (real, double, float) for a money balance. Doprowadzi cię to do kłopotów. Zamiast tego użyj DECIMAL.

+0

Ok, dziękuję ... Zapisuję twoje punkty i tutaj, po tym, jak użyję dziesiętnego. – ungalnanban

+0

@ungalnanban: Ma to związek z błędami zaokrąglania, gdy nie używasz dziesiętnych, więc lepiej, bo jeśli sumy rachunkowości są błędne, to jakakolwiek konwersja typu "float-to-string" będzie twoim mniejszym problemem ... –

Powiązane problemy