Postgresql 在Postgres中格式化数据类型real

Postgresql 在Postgres中格式化数据类型real,postgresql,string-formatting,Postgresql,String Formatting,我使用to_char()函数尝试了一系列模式,但找不到正确的模式 to_char(price, '99999990D00') 我有两个测试编号0和399326,我希望0变成“0.00”,399326变成“399326.00” 我发现我需要在我的模式中添加一个“9”,以获得预期的数量,这是我首先关心的问题。当我提供'9999999 0D99'时,我收到一条错误消息,我认为这是一个太长的模式,但这限制了我的数量。这将是一个问题。将“9990D99”作为模式提供给“399326”会导致“#####”

我使用
to_char()
函数尝试了一系列模式,但找不到正确的模式

to_char(price, '99999990D00')
我有两个测试编号0和399326,我希望0变成“0.00”,399326变成“399326.00”

我发现我需要在我的模式中添加一个“9”,以获得预期的数量,这是我首先关心的问题。当我提供'9999999 0D99'时,我收到一条错误消息,我认为这是一个太长的模式,但这限制了我的数量。这将是一个问题。将“9990D99”作为模式提供给“399326”会导致“#####”

其次,我找不到如何获得大数字后面的两个尾随零,尽管它适用于“0”。我试过使用“9999999 0D99”、“9999999 0D09”和“9999999 0D00”,但两种方式都不起作用

更新

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" 
"0.00"; "1.00"; "11.00"; "111.00"; "1111.00"; "11111.0"; "111111"; "1111111"; "11111111"
正如所料

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.00"; "111111.00"; "1111111.00"; "11111111.00" 
"0.00"; "1.00"; "11.00"; "111.00"; "1111.00"; "11111.0"; "111111"; "1111111"; "11111111"

这很奇怪,根据文档,它应该也适用于真实的数据类型。这是Postgres中的一个bug吗?

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

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

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

这将切断所有超过
real
精度的位置。

感谢您重新格式化并回答我的问题!您的解决方案适用于整数,但不适用于实数。我更新了我的问题,添加了两个示例。这只适用于整数,请看这个示例:to_char((1234567.89::real)::numeric(12,2),'9999999999 0D00FM')不,最后一个示例处理正确。大于零的位置超出了
real
所能表达的范围。最后一个示例的输出是“1234570.00”,您是说real不能包含数字1234567.89吗?是的,没错。至少还不够精确。你需要双精度。转换为
数值
会舍入不可靠的数字。