如何在 SQLite 中格式化浮点数?

wBB*_*wBB 4 sqlite formatting

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

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

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

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

Mik*_*keT 5

以下是您可以实现结果的一种方式:-

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

可能变成:-

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
             )
    )
Run Code Online (Sandbox Code Playgroud)

最里面的 SELECT 提取原始数据以及根据原始 SELECT 的新列。

中间 SELECT 为通过 printf从unit_val派生的新列的长度添加另一列(这可以在第一个/最里面的 SELECT 中完成,获取此值简化(在我看来)最外面的 SELECT,或者您可以使用多个length(myfloats)在最外面的 SELECT 中)。

结果 - 示例

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

在此处输入图片说明

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

编辑

正如你已经澄清输入是一个整数,然后: -

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

假设您至少使用 3.18 版的 SQLite。

更正

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

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

或者作为单行

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