在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
答案 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 ): -
正如您已澄清输入是整数,然后: -
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 位数字,必要时用零填充。