Двойная точность формата в PostgreSQL

У меня есть таблица с 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;

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

6
задан Erwin Brandstetter 23 September 2011 в 18:36
поделиться

3 ответа

Вы можете использовать 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
ответ дан 8 December 2019 в 13:43
поделиться

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

8
ответ дан 8 December 2019 в 13:43
поделиться
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',)]
2
ответ дан 8 December 2019 в 13:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: