2010-06-26 3 views
6

У меня есть таблица с 3 столбцами:Формат двойной точности в PostgreSQL

customer_name varchar 
,account_type varchar 
,current_balance double precision 

Пример значения для current_balance:

 
1200 
1500.5 
1500 

Я хочу, чтобы показать, как это:

 
1200.00 
1500.50 
1500.00 

Я попробовал следующий запрос:

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

Он форматирует способ, которым я хочу, но добавляет пространство в начале. Как это решить? Есть ли лучший способ форматировать?

+8

Остановитесь прямо там, где находитесь. Осторожно [прочитайте раздел о том, как парни рассматриваются в Postgres] (http://www.postgresql.org/docs/8.4/interactive/datatype-numeric.html#DATATYPE-FLOAT). Удваиваются как значения с плавающей запятой. Поплавки хранятся и вычисляются таким образом, что они могут потерять точность. Не используйте значение с плавающей точкой для хранения денежного значения. Используйте типы «NUMERIC» или «DECIMAL». – Charles

ответ

6

Вы можете использовать trim, чтобы удалить лишние пробелы. Без аргументов он удаляет только пробелы.

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

привет Charles .. если мой ввод запись 0 (Zero), то время он дает .00 только. но я хочу 0,00, как я могу это сделать ..? – ungalnanban

+0

Я не знаю, на самом деле. Я все еще изучаю все входы и выходы Postgres. Если все остальное не удается, вы можете попробовать «CASE», чтобы проверить, равно ли число, и возвращает «0.00», если это так. – Charles

+2

Поздно к вечеринке, но кто-то должен, вероятно, упомянуть '99 ... 0D99 'как возможное решение для требования 0.00. – VoiceOfUnreason

2
to_char(current_balance, 'FM9999999999999999D99') 

От the docs:

FM: Режим префикса заполнения (подавить обивка пробелы и нули)

Если вы хотите, символ валюты локализованную, попробуйте L:

to_char(current_balance, 'FML9999999999999999D99') 

L: валюта символ (используется локаль)

Результаты PG 8.4 против колонке под названием dbl со значением 12345.678 где 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

Нет, он дает неправильный formate. – ungalnanban

6

Как уже отмечались в комментариях, it's bad design to use a floating point type (real, double, float) for a money balance. Это приведет вас к неприятностям. Вместо этого используйте DECIMAL.

+0

Хорошо спасибо ... Я отмечаю ваши баллы и здесь, после того, как буду использовать десятичные числа. – ungalnanban

+0

@ungalnanban: Это связано с ошибками округления, когда вы не используете десятичные числа, поэтому вам лучше делать это, потому что если суммы бухгалтерского учета ошибочны, любое преобразование с плавающей точкой в ​​строку будет вашей меньшей проблемой ... –

Смежные вопросы