通过在oracle中添加小数来更改数字格式
Change number format by adding decimal to it in oracle
我有一个数字 000005500,我希望它的格式为 0000055.00 或 55.00,使用 Oracle select 查询。
我使用了这个查询:
select to_char(to_number(000005500),'99.99') from dual
但显示 #####
如何以我需要的格式显示它?
正如所写,您的 to_number()
调用只是隐式转换为字符串,然后显式转换回数字,这似乎毫无意义,但我假设您实际上是在处理来自varchar2
列。在这种情况下,您会看到:
select to_char(to_number('000005500'),'99.99') from dual
TO_CHA
------
######
您看到哈希值是因为您无法将四位数 5500 放入 99.99 格式 - 小数点前有四位数字,而格式掩码只允许两位。
您似乎遗漏了除以 100 得到的小数:
select to_char(to_number('000005500') / 100,'99.99') from dual;
TO_CHA
------
55.00
另一种方法,如果您想将其保留为与原始值具有相同数量前导零的字符串,则将其保留为字符串,用 substr()
将其切碎,然后连接零件重新组合在一起。使用 CTE 作为演示:
with t as (select '000005500' as val from dual)
select val, substr(val, 1, length(val) - 2)
|| '.' || substr(val, length(val) - 1, 2) as adj_val
from t;
VAL ADJ_VAL
--------- ---------------------------------------------
000005500 0000055.00
首先,000005500
不是一个数字。数字不以零开头。你正在处理一个字符串。
I want it to be in format 0000055.00
你只能期望它是一个字符串作为输出,而不是一个数字。
无论如何,要获得 55.00
作为 NUMBER 的输出,您可以执行以下操作 -
SQL> WITH DATA AS(
2 SELECT '000005500' num FROM DUAL
3 )
4 SELECT to_char(to_number(replace(num,'0','')),'99D99') FROM DATA
5 /
TO_CHA
------
55.00
SQL>
或者,
SQL> WITH DATA AS(
2 SELECT '000005500' num FROM DUAL
3 )
4 SELECT to_char(to_number(rtrim(ltrim(num,'0'),'0')),'99D99') FROM DATA
5 /
TO_CHA
------
55.00
SQL>
编辑
Alex的方法也不错,用简单的数学就把它转换成了DECIMAL。我更喜欢他的第一部分。
关于最终格式的另外几个备选方案:
select to_char(to_number('000005500')/100,'0999999D90') leading_zeros,
to_char(to_number('000005500')/100,'fm9999999D90') no_leading_zeros
from dual;
我有一个数字 000005500,我希望它的格式为 0000055.00 或 55.00,使用 Oracle select 查询。
我使用了这个查询:
select to_char(to_number(000005500),'99.99') from dual
但显示 #####
如何以我需要的格式显示它?
正如所写,您的 to_number()
调用只是隐式转换为字符串,然后显式转换回数字,这似乎毫无意义,但我假设您实际上是在处理来自varchar2
列。在这种情况下,您会看到:
select to_char(to_number('000005500'),'99.99') from dual
TO_CHA
------
######
您看到哈希值是因为您无法将四位数 5500 放入 99.99 格式 - 小数点前有四位数字,而格式掩码只允许两位。
您似乎遗漏了除以 100 得到的小数:
select to_char(to_number('000005500') / 100,'99.99') from dual;
TO_CHA
------
55.00
另一种方法,如果您想将其保留为与原始值具有相同数量前导零的字符串,则将其保留为字符串,用 substr()
将其切碎,然后连接零件重新组合在一起。使用 CTE 作为演示:
with t as (select '000005500' as val from dual)
select val, substr(val, 1, length(val) - 2)
|| '.' || substr(val, length(val) - 1, 2) as adj_val
from t;
VAL ADJ_VAL
--------- ---------------------------------------------
000005500 0000055.00
首先,000005500
不是一个数字。数字不以零开头。你正在处理一个字符串。
I want it to be in format 0000055.00
你只能期望它是一个字符串作为输出,而不是一个数字。
无论如何,要获得 55.00
作为 NUMBER 的输出,您可以执行以下操作 -
SQL> WITH DATA AS(
2 SELECT '000005500' num FROM DUAL
3 )
4 SELECT to_char(to_number(replace(num,'0','')),'99D99') FROM DATA
5 /
TO_CHA
------
55.00
SQL>
或者,
SQL> WITH DATA AS(
2 SELECT '000005500' num FROM DUAL
3 )
4 SELECT to_char(to_number(rtrim(ltrim(num,'0'),'0')),'99D99') FROM DATA
5 /
TO_CHA
------
55.00
SQL>
编辑
Alex的方法也不错,用简单的数学就把它转换成了DECIMAL。我更喜欢他的第一部分。
关于最终格式的另外几个备选方案:
select to_char(to_number('000005500')/100,'0999999D90') leading_zeros,
to_char(to_number('000005500')/100,'fm9999999D90') no_leading_zeros
from dual;