Формат двойной точности в PostgreSQL - PullRequest
6 голосов
/ 26 июня 2010

У меня есть таблица с 3 столбцами:

  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;

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

Ответы [ 3 ]

7 голосов
/ 26 июня 2010

Вы можете использовать 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)
7 голосов
/ 28 июня 2010

Как уже указывалось в комментарии, это плохо дизайн для использования типа с плавающей запятой (real, double, float) для баланса денег . Это приведет вас к неприятностям. Вместо этого используйте DECIMAL.

2 голосов
/ 26 июня 2010
to_char(current_balance, 'FM9999999999999999D99')

С Документы :

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',)]
...