Форматирование данных типа real в Postgres - PullRequest
0 голосов
/ 08 ноября 2018

Я перепробовал целый ряд паттернов с помощью функции to_char(), но не могу найти правильный.

to_char(price, '99999990D00')

У меня есть два тестовых номера 0 и 399326, я хочу, чтобы 0 стал «0,00», а 399326 - «399326,00».

Я узнал, что мне нужно было добавить 9 к моему шаблону, чтобы ожидать столько чисел, что является моей первой проблемой. Когда я поставляю «999999990D99», я получаю сообщение об ошибке, я предполагаю, что это слишком длинный шаблон, но это ограничивает мои цифры. Это будет проблемой. поставка '9990D99' в качестве шаблона для '399326' приводит к '####.'.

Во-вторых, я не могу найти, как получить два конечных нуля за большим числом, хотя это работает с '0'. Я пытался использовать '999999990D99', '999999990D09' и '999999990D00', но, похоже, это не сработало.

UPDATE

Решение Laurenz Albe работает с целыми числами, посмотрите на два моих примера ниже:

SELECT
    to_char(0, '99999999990D00FM'),
    to_char(1, '99999999990D00FM'),
    to_char(11, '99999999990D00FM'),
    to_char(111, '99999999990D00FM'),
    to_char(1111, '99999999990D00FM'),
    to_char(11111, '99999999990D00FM'),
    to_char(111111, '99999999990D00FM'),
    to_char(1111111, '99999999990D00FM'),
    to_char(11111111, '99999999990D00FM')
WHERE 1=1

выходы:

"0.00"; "1.00"; "11.00"; "111.00"; "1111.00"; "11111.00"; "111111.00"; "1111111.00"; "11111111.00" 

Как и ожидалось.

SELECT
    to_char(0::real, '99999999990D00FM'),
    to_char(1::real, '99999999990D00FM'),
    to_char(11::real, '99999999990D00FM'),
    to_char(111::real, '99999999990D00FM'),
    to_char(1111::real, '99999999990D00FM'),
    to_char(11111::real, '99999999990D00FM'),
    to_char(111111::real, '99999999990D00FM'),
    to_char(1111111::real, '99999999990D00FM'),
    to_char(11111111::real, '99999999990D00FM')
WHERE 1=1
* * Тысяча двадцать-одина выходы: * * 1 022
"0.00"; "1.00"; "11.00"; "111.00"; "1111.00"; "11111.0"; "111111"; "1111111"; "11111111"

И это странно, согласно документации это должно работать и для реального типа данных. Это ошибка в Postgres?

1 Ответ

0 голосов
/ 08 ноября 2018

Приведите real s к numeric и используйте модификатор FM:

SELECT to_char((REAL '123456789')::numeric, '99999999990D00FM');

   to_char    
--------------
 123457000,00
(1 row)

Это обрезает все позиции, которые превышают точность real.

...