在Oracle中使用TO_CHAR设置数字格式

ijnw1ujt  于 2023-10-16  发布在  Oracle
关注(0)|答案(2)|浏览(151)

正确的方式来格式化的数字在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的问题。如果我给予一个更大的数字,它将显示为“#”
我还有别的办法吗?

ibrsph3r

ibrsph3r1#

我需要显示2位小数货币领域。
确保使用具有适合数据的小数位数和精度的数字数据类型,而不是使用没有小数位数和精度的NUMBER。如果你打算储存美元/欧元/英镑等。那么Gross World Product在2014年的数量级为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;
/

然后,如果您在存储过程/包中引用该子类型,则在不引发异常的情况下,您将无法超过货币数据类型的最大大小。用于显示值的格式模型只需要在一个地方定义,并且由于输入仅限于货币子类型,因此格式化函数将永远不会超过强加的比例/精度,并且不能输出# 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;
/
i1icjdpr

i1icjdpr2#

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

select to_char(9876.23 , 'fm9999999999999999999990D00') from dual;

ps;您可能需要考虑使用D而不是.(不是每个国家都使用.作为小数点分隔符-D是语言敏感的,将使用适当的符号)

相关问题