【问题标题】:decimal separator oracle小数分隔符 oracle
【发布时间】:2016-12-08 22:26:25
【问题描述】:

我需要用点替换逗号,然后我需要我的值是一个数字。 所以我写了这个:

select replace('12345,6789', ',' , '.') from dual --it works fine

但是我想转换 to_number 那个值,我得到了错误:

"invalid number"

【问题讨论】:

标签: sql oracle decimal


【解决方案1】:

to_number() function 使用会话的NLS_NUMERIC_CHARACTERS 设置来决定如何解释逗号和句点。如果你知道你的字符串总是有一个逗号作为小数分隔符,你可以使用可选的第三个参数覆盖它作为调用的一部分;尽管这确实意味着您必须指定格式模型:

select to_number('12345,6789', '9999999999D9999', 'NLS_NUMERIC_CHARACTERS='',.''')
from dual;

TO_NUMBER('12345,6789','9999999999D9999
---------------------------------------
                             12345.6789

您不需要单独的replace() 步骤。

您也可以使用ALTER SESSION SET NLS_NUMERIC_CHARACTERS=',.'; 更改会话设置,但您可能无法控制必须运行您的代码的每个客户端的设置。

【讨论】:

  • 我在使用这个解决方案时遇到了一些问题。我检查了参数 NLS_NUMERIC_CHARACTERS。它使用值',.' 正确设置。但是当我尝试将字符串转换为数字时,小数分隔符消失了。见:gist.github.com/kovalensue/52383a9d138ea39584ff854b58c6dc4e
  • @kovalensue - 这个问题已经有四年多了,所以如果你有后续问题,你应该问一个新问题。但是 v$paramater 的值是., 而不是,.;但无论如何,重要的是您的会话值,因此请检查nls_session_parameters 视图中显示的内容。如果您按照答案中所示执行alter session,那么您的查询将获得213174,11。或者包括第三个参数,如图所示。
【解决方案2】:

小数点分隔符在您的语言环境中定义。这里看起来像是,。所以你不需要在转换你的字符串之前进行替换:

select to_number('12345.6789') from dual --should work already

或更改您的语言环境:

alter session  set NLS_NUMERIC_CHARACTERS= '.,';
select to_number('123'||'.'||'456') from dual;
select to_number(replace('12345,6789', ',' , '.')) from dual

【讨论】:

    猜你喜欢
    • 2016-03-22
    • 2011-04-21
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多