在 Postgres 中格式化数据类型 real
Formatting data type real in Postgres
我用 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 中的错误吗?
将 real
转换为 numeric
并使用 FM
修饰符:
SELECT to_char((REAL '123456789')::numeric, '99999999990D00FM');
to_char
--------------
123457000,00
(1 row)
这将切断所有超过 real
精度的位置。
我用 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 中的错误吗?
将 real
转换为 numeric
并使用 FM
修饰符:
SELECT to_char((REAL '123456789')::numeric, '99999999990D00FM');
to_char
--------------
123457000,00
(1 row)
这将切断所有超过 real
精度的位置。