使用 TO_CHAR 在 Oracle 中设置数字格式
Number formatting in Oracle using TO_CHAR
在 ORACLE 存储过程中格式化数字的正确方法。
我需要显示两位小数的货币字段。
预期输出如下:
- 0 > 0.00
- 5 > 5.00
- 1253.6 > 1253.60
- 1253.689 > 1253.69
以下对我有用:
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;
/
在 ORACLE 存储过程中格式化数字的正确方法。
我需要显示两位小数的货币字段。 预期输出如下:
- 0 > 0.00
- 5 > 5.00
- 1253.6 > 1253.60
- 1253.689 > 1253.69
以下对我有用:
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;
/