当前位置: 首页 > 面试题库 >

Oracle中使用TO_CHAR进行数字格式设置

詹唯
2023-03-14
问题内容

在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的问题。如果我提供更大的数字,它将显示为“ ###############”

我还有其他方法可以做到这一点吗?


问题答案:

我需要显示2位小数的货币字段。

确保使用数字数据类型,并且其缩放比例和精度适合于数据,而不要使用NUMBER没有缩放比例和精度的数字数据类型。如果您要存储美元/欧元/英镑/等。那么2014年世界生产总值(Gross
World
Product

)约为1亿亿美元。假设您处理的金额不会超过此[需要的引文],那么您的货币栏可以是:

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;
/

Then if you reference that sub-type in your stored procedures/packages you
will not be able to exceed the maximum size of the currency data type without
an exception being raised. The format model for displaying the value only
needs to be defined in a single place and since the input is limited to the
currency sub-type, then the formatting function will never exceed the imposed
scale/precision and cannot output #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;
/


 类似资料:
  • 问题内容: 我试图找出to_char()的格式规范,这将给我以下结果。 给出0.1并: 给出1。 我尝试了以下解决方案: 给出“ .1”。 给出0.1,这是可以的,但是: 给出1.0,这不行。 你有什么建议吗? 问题答案: 返回的精度需要保持一致,因此唯一的选择是使用DECODE或CASE语句有条件地返回您需要的内容: 该示例不是很好-尚不清楚您的数据是否将具有或大于1 / etc的值。 编辑Mi

  • 我使用以下sql将字符串与日期oracle进行比较,但得到的结果不正确。我尝试了to\u date、to\u char选项,但没有得到任何正确的结果。 地点日期1:10-JUN-2101.00.00.000000000 AM日期2:10-JUN-2021 01:00 上述sql返回上述Date1和Date2的行,尽管它们相等。Date1也是varchar格式,Date2是带有本地时区格式的时间戳(

  • 问题内容: 我想知道是否有可能在Java中使用String.format方法给出一个在零之前的整数? 例如: 1将变为001 2将变为002 … 11将变为011 12将变为012 … 526将保留为526 … 目前,我尝试了以下代码: 不幸的是,它在数字之前带有3个空格。可以在数字前加零吗? 问题答案: 使用格式说明为整数。的装置,该数目将是零填充,如果它是少于三个(在这种情况下)位。 有关其他

  • 问题内容: 我正在尝试在select语句中打印日期,但是我需要在输出中添加一个字母: Oracle不喜欢T。我只希望T像冒号和破折号一样输出。我可以用反斜杠或其他东西来逃脱吗? 问题答案: 您只需要在它周围加上双引号即可:

  • 我在第二个脚本中得到错误。请解释为什么我在第二个脚本中得到错误。 从LCL_SHR_IncidentIntegrationInt中选择count(*),其中externalsystem='ipsoft'和(to_char(sysdate,'yyyymmddhh24miss')-to_char(fn_adjusted_date(CREATE_DATE),'yyyymmddhh24miss'))>18

  • 我使用了<code>字符串。format()四舍五入到小数点后三位。然而,这不起作用,我使用解决了它。我实施了什么错误吗? 预期: 23.70 结果 : 23.69