如何格式化一些任意长度?

时间:2015-02-26 21:28:46

标签: postgresql

如果我的数据包含一个数字列,其数值包含千分之一(例如63254830038),并且我想将数字格式化为美元数量(例如$63,254,830,038),我知道我可以用:

SELECT numeric_column, to_char(numeric_column, '$999G999G999G999') from table

格式化值,但为了可靠地执行此操作,我要么必须包含不必要的长文本字符串(' $ 999G999G999G999'),要么知道可能的最大位数。有没有办法说,广泛地说,"组号用逗号"而不是明确地说"组成数百,组成数千,哦!请分组数百万"?

3 个答案:

答案 0 :(得分:1)

您只需要将integer转换为money类型。

E.g:

tests=> select cast(63254830038 as money);

或替代语法:

tests=> select 6323254830038::money;

并输出(我来自波兰,所以money类型采用我的区域设置并设置正确的货币符号):

        money         
----------------------
 63.254.830.038,00 zł

Monetary Types文档。

答案 1 :(得分:0)

您可以尝试这样的事情(在sql-server中工作,不确定postgresql)

选择转换(varchar,演员(' 63254830038'作为金钱),1)

答案 2 :(得分:0)

你可以用正则表达式做事:将数字转换为字符串,反转它,使用regexp_replace在3对数字对之间插入逗号,然后再将其反转:

select '$' || reverse(regexp_replace(
                reverse(numeric_column::varchar),
                E'(\\d\\d\\d)(?=\\d)', '\1,', 'g'))

说明

regexp_replace的第一个参数是要匹配的表达式,它包含两部分:

  • (\\d\\d\\d)表示已捕获的3位数字
  • (?=\\d)是单个数字的正前瞻约束,这意味着匹配仅在其后面有数字时才计算。 (也就是说,这个数字被检查存在,但它不算作比赛的一部分。)

第二个参数是替换为:3个捕获的数字,加上逗号。

第三个参数'g'是一个标志,表示它应该尽可能多地匹配和替换。

有关PostgreSQL中正则表达式的更多信息,请参阅the documentation