Sql Oracle中使用TO_CHAR的数字格式

Sql Oracle中使用TO_CHAR的数字格式,sql,oracle,number-formatting,Sql,Oracle,Number Formatting,在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”是个问题?(如果您计划使用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。如果我给出一个更大的数字,它将显示为“###########”

我还有别的办法吗?

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

聚苯乙烯;您可能需要考虑使用<代码> d>代码>而不是<代码> .<代码>(不是每个国家都使用<代码> .<代码>作为小数分隔符-<代码> d>代码>是语言敏感的,并将使用适当的符号)

我需要用2位小数显示货币字段

确保您使用的数字数据类型具有与数据相应的比例和精度,而不是使用不带比例和精度的
number
。如果你打算储存美元/欧元/英镑/等,那么2014年的订单金额为10000000000000美元。假设您处理的内容不会超过此[需要引证],那么您的货币栏可以是:

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


对于较大的数字,请在格式说明符中增加9的数量。如果向下的投票者能够解释为什么…,我将不胜感激:(这对我来说是一个合理的论点。
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;
/