使用TO_CHAR在Oracle中进行数字格式化
在ORACLE存储过程中格式化数字的正确方法。使用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;
但这有硬c的问题编了一堆9。如果我给一个更大的数字,它会显示为“##############”
有没有其他方法可以做到这一点?
回答:
我需要2位小数,显示货币字段。
确保您使用具有适合数据的比例和精度的数字数据类型,而不使用NUMBER
而没有比例和精度。如果你打算存储美元/欧元/磅/等。那么Gross World Product是的$ 100,000,000,000,000在2014年的订单让我们假设你是不是将要处理超过此[来源请求]那么你的货币列可以是:
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;
/
然后,如果你引用的子类型的存储过程/包,您将无法超过货币数据类型的最大大小,而不会引发异常。显示值的格式模型只需要在一个地方定义,并且由于输入限于货币子类型,所以格式化函数将永远不会超过强加的比例/精度,并且不能输出#
。
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;
/
回答:
为什么“硬编码一堆9”是一个问题? (如果你打算使用TO_CHAR,你需要这么做)
select to_char(9876.23 , 'fm9999999999999999999990D00') from dual;
ps;你可能要考虑使用D
而不是.
(不是每个国家使用.
作为小数点分隔 - D
是语言敏感,将使用相应的符号)
以上是 使用TO_CHAR在Oracle中进行数字格式化 的全部内容, 来源链接: utcz.com/qa/261770.html