Sql Oracle中使用TO_CHAR的数字格式
在ORACLE存储过程中设置数字格式的正确方法 我需要用2位小数显示货币字段。 预期产出如下: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,则需要
- 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;
/