在 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
以下是您可以实现结果的一种方式:-
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):-
正如你已经澄清输入是一个整数,然后: -
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)
| 归档时间: |
|
| 查看次数: |
6205 次 |
| 最近记录: |