【发布时间】:2016-12-08 22:26:25
【问题描述】:
我需要用点替换逗号,然后我需要我的值是一个数字。 所以我写了这个:
select replace('12345,6789', ',' , '.') from dual --it works fine
但是我想转换 to_number 那个值,我得到了错误:
"invalid number"
【问题讨论】:
我需要用点替换逗号,然后我需要我的值是一个数字。 所以我写了这个:
select replace('12345,6789', ',' , '.') from dual --it works fine
但是我想转换 to_number 那个值,我得到了错误:
"invalid number"
【问题讨论】:
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=',.'; 更改会话设置,但您可能无法控制必须运行您的代码的每个客户端的设置。
【讨论】:
',.' 正确设置。但是当我尝试将字符串转换为数字时,小数分隔符消失了。见:gist.github.com/kovalensue/52383a9d138ea39584ff854b58c6dc4e
., 而不是,.;但无论如何,重要的是您的会话值,因此请检查nls_session_parameters 视图中显示的内容。如果您按照答案中所示执行alter session,那么您的查询将获得213174,11。或者包括第三个参数,如图所示。
小数点分隔符在您的语言环境中定义。这里看起来像是,。所以你不需要在转换你的字符串之前进行替换:
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
【讨论】: