如何在SQLite中格式化Float数字?

时间:2018-02-10 00:57:00

标签: sqlite formatting

在SQLite中,我需要格式化一个数字,用千位分隔符和小数分隔符显示它。示例:数字123456789应显示为1,234,567.89

我所做的部分工作是因为它没有像我预期的那样显示千位分隔符:

select *, printf ("U$%.2f", CAST(unit_val AS FLOAT) / 100) AS u_val FROM items;

u_val显示:U$1234567.89但我需要U$1,234,567.89

2 个答案:

答案 0 :(得分:1)

以下是您可以完成结果的一种方法: -

select *, printf ("U$%.2f", CAST(unit_val AS FLOAT) / 100) AS u_val FROM items;

可能成为: -

SELECT 
*, 
CASE
    WHEN len < 9 THEN myfloat 
    WHEN len> 8  AND len < 12 THEN substr(myfloat,1,len - 6)||','||substr(myfloat,len - 5)
    WHEN len > 11 AND len < 15 THEN substr(myfloat,1,len -9)||','||substr(myfloat,len-8,3)||','||substr(myfloat,len-5)
    WHEN len > 14 AND len < 18 THEN substr(myfloat,1,len - 12)||','||substr(myfloat,len -11,3)||','||substr(myfloat,len-8,3)||','||substr(myfloat,len-5)
END AS u_val
FROM   
    (
        SELECT *, length(myfloat) AS len
        FROM
            (
                SELECT *,printf("U$%.2f",CAST(unit_val AS FLOAT) / 100)) AS myfloat
                FROM Items
             )
    )

最里面的SELECT根据您的原始SELECT提取原始数据和新列。

中间SELECT通过printf为 unit_val 派生新列的长度添加另一列(这可能是在第一个/最里面的SELECT中完成的,这个值得到了简化(在我的意见)最外面的SELECT,或者你可以在最外面的SELECT中使用多个length(myfloats)

结果 - 示例

以下是测试结果(源列 myfloat ): -

enter image description here

  • 突出显示的列是原始列。
  • 带圆圈的数据就是结果。
  • 其他2列是中间列。

修改

正如您已澄清输入是整数,然后: -

SELECT *,'U$'||printf('%,d',(unit_val/100))||'.'||CAST((unit_val % 100) AS INTEGER) AS u_val FROM Items

假设您至少使用了SQLite 3.18版本。

校正

如果最后一部分(美分)的值小于10,则使用上面的SQL,然后删除前导0。所以正确的SQL是。请注意,为简单起见,CAST也已被删除,而不是将 . 添加到printf格式化程序字符串中,所以: -

SELECT 
    'U$' || 
    printf('%,d', (unit_val / 100)) ||
    printf('.%02d',unit_val % 100) 
    AS u_val
FROM Items

或者作为单行

SELECT 'U$' || printf('%,d', (unit_val / 100)) || printf('.%02d',unit_val % 100) AS u_val FROM Items

答案 1 :(得分:0)

这是一个建议:

WITH cte AS (SELECT 123456789 AS unit_val)
SELECT printf('%,d.%02d', unit_val/100, unit_val%100) FROM cte;

通用表表达式只是在没有变量的情况下提供一个虚拟值。

%,d 格式添加了千位分隔符,但正如许多人指出的那样,仅适用于整数。因此,您需要使用 unit_val 两次,一次用于整数部分,另一次用于计算小数部分。

SQLite 截断整数除法,因此 unit_val/100 为您提供美元部分。 % 运算符是余数运算符(与“mod”不严格相同),因此 unit_val 给出了美分部分,作为另一个内部。 %02d 格式确保这始终是 2 位数字,必要时用零填充。