【问题标题】:Number formatting in Oracle using TO_CHAROracle 中使用 TO_CHAR 的数字格式
【发布时间】:2018-05-31 13:41:37
【问题描述】:

在 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 的问题。如果我给出更大的数字,它将显示为“##############”

有没有其他方法可以做到这一点?

【问题讨论】:

  • 对于较大的数字,请增加格式说明符中 9 的数量。

标签: sql oracle number-formatting


【解决方案1】:

我需要显示带有 2 位小数的货币字段。

确保使用具有适合数据的比例和精度的数字数据类型,而不是使用没有比例和精度的NUMBER。如果您要存储美元/欧元/英镑/等。那么Gross World Product 在 2014 年的金额为 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;
/

然后,如果您在存储过程/包中引用该子类型,您将无法超过货币数据类型的最大大小,而不会引发异常。显示值的格式模型只需要在一个地方定义,由于输入仅限于货币子类型,因此格式化函数永远不会超过强制的比例​​/精度,并且无法输出#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;
/

【讨论】:

  • 这对我来说是一个合理的论点。
【解决方案2】:

为什么“硬编码一堆 9”是个问题? (如果您打算使用 TO_CHAR,则需要这样做)

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

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

【讨论】:

    猜你喜欢
    • 2019-11-25
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 2021-05-13
    相关资源
    最近更新 更多