我需要显示2位小数货币领域。 确保使用具有适合数据的小数位数和精度的数字数据类型,而不是使用没有小数位数和精度的NUMBER。如果你打算储存美元/欧元/英镑等。那么Gross World Product在2014年的数量级为100,000,000,000,000美元。让我们假设你不会处理比这更多的东西,那么你的货币列可以是:
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;
/
2条答案
按热度按时间ibrsph3r1#
我需要显示2位小数货币领域。
确保使用具有适合数据的小数位数和精度的数字数据类型,而不是使用没有小数位数和精度的
NUMBER
。如果你打算储存美元/欧元/英镑等。那么Gross World Product在2014年的数量级为100,000,000,000,000美元。让我们假设你不会处理比这更多的东西,那么你的货币列可以是:如果你得到的值大于这个值,那么你需要对你的数据进行合理性检查,并考虑大于世界总产值的值是否有意义。如果您要将值存储为例如日元或津巴布韦元,请适当调整比例。
你甚至可以在包中定义一个子类型:
您的格式化代码可以是:
然后,如果您在存储过程/包中引用该子类型,则在不引发异常的情况下,您将无法超过货币数据类型的最大大小。用于显示值的格式模型只需要在一个地方定义,并且由于输入仅限于货币子类型,因此格式化函数将永远不会超过强加的比例/精度,并且不能输出
#
s。i1icjdpr2#
为什么“硬编码一堆9”是一个问题?(如果您计划使用TO_CHAR,则需要这样做)
ps;您可能需要考虑使用
D
而不是.
(不是每个国家都使用.
作为小数点分隔符-D
是语言敏感的,将使用适当的符号)