簡體   English   中英

Oracle - 為什么在將數字轉換為 TO_CHAR 時數字的前導零消失

[英]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 中無法輕松實現這種最常見的格式。

甚至Tom Kyte 也只提出了這樣長期復雜的解決方法

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 函數具有顯着的性能開銷,不適合繁重的查詢。

這是 Oracle 提供的默認格式。 如果您想要 output 上的前導零,則需要明確提供格式。 利用:

SELECT TO_CHAR(0.56,'0.99') FROM DUAL;

甚至:

SELECT TO_CHAR(.56,'0.99') FROM DUAL;

尾隨零也是如此:

SQL> SELECT TO_CHAR(.56,'0.990') val FROM DUAL;

VAL
------
 0.560

TO_CHAR 轉換 function 的一般形式為:

TO_CHAR (數字, 格式

似乎以漂亮(對我而言)形式獲得小數的唯一方法需要一些荒謬的代碼。

到目前為止我得到的唯一解決方案:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM