2010-01-09 114 views
4

我想弄清楚to_char()的格式規範,它會給我下面的結果。十進制數,to_char和Oracle

to_char(0.1, '[FORMAT_SPEC]') 

給出了0.1:

to_char(1, '[FORMAT_SPEC]') 

給1

我嘗試了以下解決方案:

to_char(0.1) 

給」 1.1' 。

to_char(0.1, 'FM0.099') 

給出0.1,這是好的,但是:

to_char(1, 'FM0.099') 

給出1.0,這是不好的。

你有什麼建議嗎?

回答

5

精度返回需求是一致的,那麼唯一的選擇就是使用DECODECASE語句有條件返回你所需要的:

CASE 
    WHEN INSTR(TO_CHAR(t.col), '.') = 0 THEN TO_CHAR(t.col) 
    ELSE TO_CHAR(t.col, 'FM0.099') 
END 

這個例子是不是很大 - 這是不明確的,如果你的d ata將具有像1.000或值等於/ etc的值。

編輯邁克爾-O(2013年6月25日):對於那些誰需要它傻瓜型,您可以嘗試:

case 
    when instr(to_char(<col>), (select to_char(0, 'FMD') from dual)) = 0 
    then to_char(<col>) 
    else to_char(<col>, 'FM999990D999') 
end 

它會自動觀測小數點分隔符。將secodn格式模式調整爲您的號碼大小。

+1

+1表示精確度不一致,有斑點。 – Khb 2010-01-09 17:34:51

+1

正是我在找的東西。非常感謝Oracle修改格式。 – 2013-06-24 14:02:30

0

不要碰巧有一個Oracle實例方便測試這,但我認爲

TO_CHAR(1, 'FM0.999') 

現在應該做的。

+1

這將使 「0.1」 和 「1」。爲值。 – 2010-01-09 16:11:17

+0

OK,那麼RTRIM(TO_CHAR(1,'FM0.999'),'。') – 2010-01-09 17:48:58

0

不知道你會期待什麼範圍的值,但你可以區分出值< 1與那些> = 1。否則,尾隨0或小數會在你的方式來獲得:

select val, 
     case when val < 1 then to_char(val, 'FM99990.9') 
      else to_char(val, 'FM99999') 
     end fmt 
    from (select 0.1 val from dual union all 
     select 1 from dual 
     ) 
/

     VAL FMT 
---------- -------- 
     .1 0.1 
     1 1 
2

我只是用這個:

TRIM('.' FROM TO_CHAR(x, 'FM99990.999')) 
相關問題