Oracle數字格式化

Oracle數字格式化

A format model is a character literal that describes the format of datetime or numeric data stored in a character string. A format model does not change the internal representation of the value in the database. When you convert a character string into a date or number, a format model determines how Oracle Database interprets the string.

--《Oracle Database SQL Reference 》

格式模型是描述存儲在字符串中的日期時間或數字數據格式的字符文本。格式模型不會更改數據庫中值的內部表示形式。將字符串轉換爲日期或數字時,格式模型將確定Oracle數據庫如何解釋字符串。

開發中的常見問題

日常開發中由於業務需要,我們通常使用:

--fmt:稱之爲數字格式化模型
select to_char(number, 'fmt') from dual;

將數字轉換爲我們需要的格式顯示。

轉換的結果可能與預想出現偏差,例如常見的幾個問題:

  • 整數部分爲0的小數,轉換後以小數點開頭,0被省略。

    --result:'.66'
    select to_char(0.66, 'fm99.99') result from dual;
    

    出現這種問題,是因爲數字格式化模型元素9在整數部分時,如果對應位置存在數字則顯示數字,以0開頭的0不顯示,用空格佔位(在下面的數字格式模型元素中有詳細介紹)。我們需要修改一下數字格式化模型:

    --result:'0.60'
    select to_char(0.60, 'fm90.90') result from dual;
    
  • 查詢出的結果出現一連串井號(#)。

    --result:'######'
    select to_char(666.66, '99.99') result from dual;
    

    這是由於待轉化的數字位數長度大於了數字格式模型的長度(整數部分。對於小數部分來說,是將實際值四捨五入保留至與數字格式模型相同位數)

數字格式模型元素

Negative return values automatically contain a leading negative sign and positive values automatically contain a leading space unless the format model contains the MI, S, or PR format element.

--《Oracle Database SQL Reference 》

除非格式模型包含 MISPR格式元素,否則負值返回值自動包含前導負號,正值返回值自動包含前導空格(即數字轉換爲字符的結果會多出一個空格)

數字格式模型由一個或多個數字格式元素組成。下面的表列出了數字格式模型的元素並提供了一些示例。

  • 元素:FM/fm

    描述:返回沒有前導或尾隨空格的值(若小數部分以0結尾去掉0)。

    --無fm的result:'  66.660'
    --有fm的result:'66.66'
    select to_char(66.66, 'fm999.999') result from dual;
    
  • 元素:0

    描述:如果對應位置存在數字則顯示數字,不存在則顯示0(是0則顯示0)。

    --如果對應位置存在數字則顯示數字 result:' 6666'
    select to_char(6666, '0000') result from dual;
    
    --如果對應位置不存在數字則顯示0 result:' 0666'
    select to_char(666, '0000') result from dual;
    
  • 元素:9

    描述:

    1. 整數部分,如果對應位置存在數字則顯示數字(以0開頭的0不顯示,用空格佔位),不存在數字則用空格佔位。
    2. 小數部分,如果對應位置存在數字則顯示數字(以0結尾的0顯示),不存在數字則顯示0。
    --整數部分,如果對應位置存在數字則顯示數字(以0開頭不顯示0)result:'  666'
    select to_char(0666, '9999') result from dual;
    
    --整數部分,對應位置不存在則用空格佔位result:'  666'
    select to_char(666, '9999') result from dual;
    
    --小數部分,如果對應位置存在數字則顯示數字(以0結尾顯示0)result:' 66.60'
    select to_char(66.60, '99.99') result from dual;
    
    --小數部分,如果對應位置不存在數字則顯示0;result:' 66.60'
    select to_char(66.6, '99.99') result from dual;
    
  • 元素:,(半角逗號)

    描述:在指定位置返回逗號。可以在數字格式模型中指定多個逗號。

    限制:(1)逗號元素不能在數字格式模型開頭。(2)在數字格式模型中,小數點右側不能出現逗號。

    --result:' 6,666'
    select to_char(6666, '9,999') result from dual;
    
  • 元素:.(半角句號)

    描述:返回小數點,它是指定位置的句點(.)。

    限制:在數字格式模型中只能指定一個句點。

    --result:' 66.00'
    select to_char(66, '99.99') result from dual;
    
  • 元素:B

    描述:當整數部分爲零時,返回定點數整數部分的空格(與格式模型中的零無關)。

    --result:'    '(四個空格)
    select to_char(0.36, 'B099') from dual;
    
  • 元素:C

    描述:在指定位置返回ISO貨幣符號。

    --result:'     CNY66'
    select to_char(66, 'C99') result from dual;
    
  • 元素:EEEE

    描述:返回以爲科學記數法形式中使用的值。

    --result:'  6.6E+01'
    select to_char(66, '9.9EEEE') result from dual;
    
  • 元素:G(與半角逗號類似)

    描述:在指定位置返回組分隔符。可以在數字格式模型中指定多個組分隔符。

    限制:在數字格式模型中,組分隔符不能出現在小數字符或句點的右側

    --result:' 6,666'
    select to_char(6666, '9,999') result from dual;
    
  • 元素:L

    描述:在指定位置返回本地貨幣符號(NLS_currency標準)。

    --result:'         ¥66.66'
    select to_char(66.66, 'L99.99') result from dual;
    
  • 元素:美元符

    描述:返回帶有前導美元符號的值。

    --result:' $66'
    select to_char(66, '$99') result from dual;
    
  • 元素:MI

    描述:如果是負數,返回負數值且尾隨負號;如果是正數,返回正數值且尾隨空格。

    限制: MI 格式元素可以只能出現在數字的格式模型的最後一個位置。

    --返回正數值且尾隨空白result:'66.66 '
    select to_char(66.66, '99.99MI') result from dual;
    
    --返回負數值且尾隨負號result:'66.66-'
    select to_char(-66.66, '99.99MI') result from dual;
    
  • 元素:PR

    描述:如果是負數,返回尖括號包含負數值;如果是正數,返回正數值且頭尾附加空格。

    限制: PR格式元素只能出現在數字格式模型的最後一個位置。

    --返回正數值且頭尾附加空格result:' 66 '
    select to_char(66, '99PR') result from dual;
    
    --返回尖括號包含負數值result:'<66>'
    select to_char(-66, '99PR') result from dual;
    
  • 元素:RN/rn

    描述:RN結果以大寫羅馬數字形式返回。rn結果以小寫羅馬數字形式返回。(結果字符共計十五位,不足十五位以空格左補齊)

    限制: 需要格式化的數值限定在1到3999之間的整數。

    --結果以大寫羅馬數字形式返回result:'              V'
    select to_char(5, 'RN') result from dual;
    
    --結果以小寫羅馬數字形式返回result:'             iv'
    select to_char(4, 'rn') result from dual;
    
  • 元素:S

    描述:

    1. S在格式化模型前時,負數返回帶前導負號(-)與負數值,正數返回帶前導正號(+)與正數值。
    2. S在格式化模型後時,負數返回帶後導負號(-)與負數值,正數返回帶後導正號(+)與正數值。

    限制:S格式化元素只能出現在數字格式模型的第一個或最後一個位置

    --S在格式化模型前時,負數返回帶前導負號(-)與負數值result:'-66'
    select to_char(-66, 'S99') result from dual;
    
    --S在格式化模型後時,正數返回帶後導正號(+)與正數值result:'66+'
    select to_char(66, '99S') result from dual;
    
  • 元素:TM

    描述:標準數值與科學計數法,可以通過附加9或者e控制輸出,默認是TM9。

    限制:不能將此元素與任何其他元素放在一起。只能用一個9或一個E(或e),而不能用這些元素的任何組合。

    --以科學計數法輸出result:'6.66E+02'
    select to_char(666, 'TMe') result from dual;
    
    --以科學計數法輸出result:'66'
    select to_char(66, 'TM9') result from dual;
    
  • 元素:X/x

    描述:返回指定位數的十六進制值。如果指定的數字不是整數,則Oracle數據庫將其舍入爲整數。

    限制:該元素只接受正值或0。負值返回錯誤。只能在這個元素前面加上0(返回前導零)或FM。任何其他元素都返回錯誤。如果使用X既不指定0也不指定FM,則返回始終有1個前導空格。

    --以十六進制輸出result:'43'
    select to_char(66.6, 'FMxx') result from dual;
    
  • 元素:U

    描述:在指定位置返回歐元(或其他)雙貨幣符號(NLS_DUAL_CURRENCY 標準)。

    --result:'         ¥6'
    select to_char(6, 'U9') result from dual;
    
  • 元素:V

    描述:返回一個值乘以10n(如有必要,將其四捨五入),其中n是V後面9的個數。

    --n是V後面9的個數,如下V字符後9的個數是2則result:' 6666'
    select to_char(66.66, '99V99') result from dual;
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章