【问题标题】:how to format number separated by comma for every three integer digits in presto如何格式化presto中每三个整数数字用逗号分隔的数字
【发布时间】:2020-10-28 03:39:27
【问题描述】:

我想为每三个整数数字格式化一个以逗号分隔的数字。例如 12345.894 --> 12,345.894。我不知道如何格式化它。我试过举个例子,但没有运气。

format('%,.2f', 12345.894)  

以上代码会将小数点四舍五入为 2 位,因此返回 12,345.89。就我而言,我想保留小数点 12,345.894。

【问题讨论】:

    标签: format presto comma trino


    【解决方案1】:

    你可以使用正则表达式

    SELECT regexp_replace(cast(123456.8943 as VARCHAR), '(\d)(?=(\d{3})+\.)', '$1,')
      Results:
      -------
      123,456.8943
    

    一些解释:

    首先我们转换为 varchar,因为正则表达式适用于字符串。

    正则表达式实际上是说:替换您看到的任何数字\d,前提是它在“。”之前有一个或多个+ 3 位\d{3} 组。 (点)签名\.。该数字被替换为相同的数字$1,但在其后有逗号,

    例子可以看here

    你可以看到更多关于正则表达式here的讨论。

    【讨论】:

    • 有没有办法复制这个但截断任何小数?
    【解决方案2】:

    如果你想要 3 个十进制数字,你可以使用%,.3f 作为格式字符串:

    presto> select format('%,.3f', 12345.894);
       _col0
    ------------
     12,345.894
    (1 row)
    

    【讨论】:

    • 不,我想保持小数不变。例如 12345.87634 --> 12,345.87634, 12345.23476534 --> 12,345.2346534
    • 不幸的是,没有办法做到这一点。 %f 格式说明符具有固定的小数位数,默认为 6。请参阅 docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/…
    • 在我看来,您可以动态构建“3”的部分并将concat作为第一个参数。例如,选择 format('%,.' || cas​​t(calculated_length as varchar) || 'f' ,value)
    猜你喜欢
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 2017-08-23
    相关资源
    最近更新 更多