簡體   English   中英

Oracle中使用TO_CHAR進行數字格式化

[英]Number formatting in Oracle using TO_CHAR

在ORACLE存儲過程中格式化數字的正確方法。

我需要顯示2位小數的貨幣字段。 預期輸出如下:

  • 0> 0.00
  • 5> 5.00
  • 1253.6> 1253.60
  • 1253.689> 1253.69

下面為我​​工作:

select to_char(9876.23 , 'fm999990.00') from dual;

但這存在硬編碼一堆9的問題。 如果我提供更大的數字,它將顯示為“ ###############”

我還有其他方法可以做到嗎?

我需要顯示2位小數的貨幣字段。

確保使用數字數據類型,其小數位數和精度適合於數據,而不要使用沒有小數位數和精度的NUMBER 如果您要存儲美元/歐元/英鎊/等。 那么2014年世界生產總值(Gross World Product )約為1億億美元。假設您處理的金額不會超過[需要的引文],那么您的貨幣欄可以是:

NUMBER(17,2)

如果獲得的值大於該值,則需要對數據進行完整性檢查,並考慮大於世界總產值的數量是否有意義。 如果要以日元或津巴布韋美元等形式存儲值,請適當調整比例。

您甚至可以將包中的子類型定義為:

CREATE PACKAGE currencies_pkg IS
  SUBTYPE currency_type IS NUMBER(17,2);

  FUNCTION formatCurrency(
    amount IN CURRENCY_TYPE
  ) RETURN VARCHAR2;
END;
/

您用於格式化的代碼可以是:

CREATE PACKAGE BODY currencies_pkg IS
  FUNCTION formatCurrency(
    amount IN CURRENCY_TYPE
  ) RETURN VARCHAR2
  IS
  BEGIN
    RETURN TO_CHAR( currency_value, 'FM999999999999990D00' );
  END;
END;
/

然后,如果您在存儲過程/程序包中引用了該子類型,則不會引發貨幣數據類型的最大大小,而不會引發異常。 用於顯示值的格式模型僅需要在一個地方被定義,並且由於輸入被限制在貨幣子類型,則格式化功能將永遠不會超過所施加的尺度/精度和不能輸出#秒。

CREATE PROCEDURE your_procedure(
  in_value1 IN ACCOUNTS_TABLE.ACCOUNT_BALANCE%TYPE,
  in_value2 IN ACCOUNTS_TABLE.ACCOUNT_BALANCE%TYPE
)
IS
  v_value CURRENCIES_PKG.CURRENCY_TYPE;
BEGIN
  -- Do something
  v_value := in_value1 + in_value2;
  -- Output formatted value
  DBMS_OUTPUT.PUT_LINE( CURRENCIES_PKG.formatCurrency( v_value ) );
END;
/

為什么“對一堆9s進行硬編碼”是一個問題? (如果您打算使用TO_CHAR,這就是您需要執行的操作)

select to_char(9876.23 , 'fm9999999999999999999990D00') from dual;

PS; 您可能要考慮使用D而不是. (並非每個國家都使用.作為小數點分隔符D語言敏感,並且會使用適當的符號)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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