У меня есть таблица с 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;
Это форматирует способ, которым я хочу, но добавляет пространство вначале. Как решить это? Существует ли лучший способ отформатировать?
Вы можете использовать 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)
Как уже указывалось в одном из комментариев, это плохой дизайн использовать тип с плавающей точкой (real, double, float) для денежного баланса. Это приведет вас к проблемам. Вместо этого используйте DECIMAL
.
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',)]