在Postgres中格式化实际的数据类型

时间:2018-11-08 19:24:56

标签: postgresql string-formatting

我使用to_char()函数尝试了各种模式,但是找不到合适的模式。

to_char(price, '99999990D00')

我有两个测试编号0和399326,我希望0成为“ 0.00”,而399326成为“ 399326.00”。

我发现我需要在模式中添加一个“ 9”,以获取尽可能多的数字,这是我的首要考虑。当我提供“ 999999990D99”时,我收到一条错误消息,我认为这是一个太长的模式,但这限制了我的人数。这将是一个问题。将'9990D99'作为模式提供给'399326'将导致'####。'。

第二,尽管它与'0'配合使用,但我找不到如何使大数字后面的两个尾随零。我尝试使用“ 999999990D99”,“ 999999990D09”和“ 999999990D00”,但这两种方法似乎均不起作用。

更新

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

输出:

"0.00"; "1.00"; "11.00"; "111.00"; "1111.00"; "11111.0"; "111111"; "1111111"; "11111111"

这很奇怪,根据文档,它也应适用于实际数据类型。这是Postgres中的错误吗?

1 个答案:

答案 0 :(得分:1)

real转换为numeric,并使用FM修饰符:

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

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

这会切断所有超出real精度的位置。