使用 TO_CHAR 在 Oracle 中设置数字格式

Number formatting in Oracle using TO_CHAR

在 ORACLE 存储过程中格式化数字的正确方法。

我需要显示两位小数的货币字段。 预期输出如下:

以下对我有用:

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

但这有硬编码一堆 9 的问题。如果我给一个更大的数字,它将显示为“##############”

还有其他方法吗?

为什么 "hardcoding a bunch of 9s" 是个问题? (如果你打算使用TO_CHAR,这就是你需要做的)

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

ps;您可能要考虑使用 D 而不是 .(并非每个国家/地区都使用 . 作为小数点分隔符 - D 对语言敏感,将使用适当的符号)

I need to display currency fields with 2 decimals.

确保使用具有适合数据的比例和精度的数字数据类型,而不是使用没有比例和精度的 NUMBER。如果您要存储 dollars/euroes/pounds/etc。那么 2014 年 Gross World Product 的金额约为 100,000,000,000,000 美元。让我们假设您不会处理超过这个的金额[需要引用] 那么您的货币栏可以是:

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;
/

然后,如果您在存储的 procedures/packages 中引用该子类型,您将无法超过货币数据类型的最大大小,而不会引发异常。显示值的格式模型只需要在一个地方定义,并且由于输入仅限于货币子类型,因此格式功能永远不会超过强加的scale/precision并且不能输出#s.

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;
/