[英]Oracle - Why does the leading zero of a number disappear when converting it TO_CHAR
Oracle中,將前導零的數字轉換為字符時,為什么前導數字消失了? 這個邏輯Oracle是特有的,還是SQL特有的?
例子:
SELECT TO_CHAR(0.56) FROM DUAL;
/* Result = .56 */
我正在尋找一種方法來格式化數字,而不需要前導或尾隨空格、句點、零(對於應該存在的小於 1 的數字,前導零除外)。
令人沮喪的是,在 Oracle 中無法輕松實現這種最常見的格式。
case when trunc(x)=x
then to_char(x, 'FM999999999999999999')
else to_char(x, 'FM999999999999999.99')
end x
但我能夠找到更短的解決方案,只提到一次該值:
rtrim(to_char(x, 'FM999999999999990.99'), '.')
這對所有可能的值都按預期工作:
select
to_char(num, 'FM99.99') wrong_leading_period,
to_char(num, 'FM90.99') wrong_trailing_period,
rtrim(to_char(num, 'FM90.99'), '.') correct
from (
select num from (select 0.25 c1, 0.1 c2, 1.2 c3, 13 c4, -70 c5 from dual)
unpivot (num for dummy in (c1, c2, c3, c4, c5))
) sampledata;
| WRONG_LEADING_PERIOD | WRONG_TRAILING_PERIOD | CORRECT |
|----------------------|-----------------------|---------|
| .25 | 0.25 | 0.25 |
| .1 | 0.1 | 0.1 |
| 1.2 | 1.2 | 1.2 |
| 13. | 13. | 13 |
| -70. | -70. | -70 |
仍在尋找更短的解決方案。
自定義助手 function 有一個縮短方法:
create or replace function str(num in number) return varchar2
as
begin
return rtrim(to_char(num, 'FM999999999999990.99'), '.');
end;
但是自定義 pl/sql 函數具有顯着的性能開銷,不適合繁重的查詢。
似乎以漂亮(對我而言)形式獲得小數的唯一方法需要一些荒謬的代碼。
到目前為止我得到的唯一解決方案:
CASE WHEN xy>0 and xy<1 then '0' || to_char(xy) else to_char(xy)
xy
是小數。
xy query result
0.8 0.8 --not sth like .80
10 10 --not sth like 10.00
這只適用於小於 1 的數字。
select to_char(12.34, '0D99') from dual;
-- Result: #####
這行不通。
你可以做這樣的事情,但這會導致前導空格:
select to_char(12.34, '999990D99') from dual;
-- Result: ' 12,34'
最終,您可以添加一個 TRIM 以再次消除空格,但我也不認為這是一個合適的解決方案......
select trim(to_char(12.34, '999990D99')) from dual;
-- Result: 12,34
同樣,這僅適用於最多 6 位數字的數字。
編輯:我想將此添加為對 DCookie 建議的評論,但我不能。
嘗試這樣做以避免 to_char 限制:
SELECT
regexp_replace(regexp_replace(n,'^-\'||s,'-0'||s),'^\'||s,'0'||s)
FROM (SELECT -0.89 n,RTrim(1/2,5) s FROM dual);
應該在所有情況下工作:
SELECT regexp_replace(0.1234, '^(-?)([.,])', '\10\2') FROM dual
下面的格式試試數字是否像
ex 1 假設像 10.1 這樣的數字,如果應用以下格式,它將是 10.10
ex 2 假設數字 like.02 如果應用以下格式,它將是 0.02
ex 3 假設像 0.2 這樣的數字,如果應用以下格式,它將是 0.20
to_char(round(to_number(column_name)/10000000,2),'999999999990D99') 作為 column_name
如果您的國家/地區支持小數點逗號,請使用:
SELECT regexp_replace(
regexp_replace(to_char(YOUR_NUMBER), '^,', '0,'), -- Positives
'^-,', '-0,') -- Negatives
否則,如果您的國家/地區支持小數點,請使用:
SELECT regexp_replace(
regexp_replace(to_char(YOUR_NUMBER), '^.', '0.'), -- Positives
'^-.', '-0.') -- Negatives
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.