从带有特殊字符的字符串转换为数字

Posted

技术标签:

【中文标题】从带有特殊字符的字符串转换为数字【英文标题】:Converting to number from string with special characters 【发布时间】:2016-01-30 20:07:23 【问题描述】:

我有一个包含以下值的输入列。

1.2%
111.00$
$100.00
aa
ss

预期输出

1.2
111.00
100.00
null
null

我正在尝试使用 REGEXP_REPLACE 并尝试替换每个不是数字或“。”的字符这样1.2% 就会变成1.2。 这是我尝试过的查询,但没有成功。

regexp_replace('%1.aa2', '[^[\d|\.]]', '') 

谁能建议如何做到这一点?我做错了什么?我正在与 pl/sql 开发人员一起开发 Oracle 11.2 数据库。

【问题讨论】:

只需在模式中使用[^\d.]+ 这不起作用,它替换了除“.”之外的所有内容。这是我使用的查询 select regexp_replace('%1.aa2', '[^\d.]+', '') from dual 我猜在这种情况下你也必须转义反斜杠。试试\\d 而不是\d 【参考方案1】:

使用 POSIX 类来匹配数字字符,即[:digit:]。所以这个否定类[^[:digit:].] 应该匹配任何字符,但不能匹配点或数字。

regexp_replace('%1.aa2', '[^[:digit:].]', '') 

【讨论】:

这与 '[^[\d.]] 有何不同? 不知道oracle是否支持\d。如果它支持,那么它将是[^\d.] 谢谢@Avinash raj。 [:digit] 工作正常。我确信oracle 也支持'\d'。检查此语句 select regexp_replace('asas12313', '\d', '-') from dual【参考方案2】:

您可以使用[^0-9.] 正则表达式并替换为空字符串:

with testdata(txt) as (
  select 'ss' from dual
  union
  select 'aa' from dual
  union
  select '$100.00'      from dual
  union
  select '111.00$'             from dual
  union
  select '1.2%'             from dual
)
select regexp_replace(txt, '[^0-9.]', '')
from testdata;

SQL fiddle 的结果:

【讨论】:

以上是关于从带有特殊字符的字符串转换为数字的主要内容,如果未能解决你的问题,请参考以下文章

带有特殊字符的 XML 在 C# 中转换为 Json

带有转换的特殊字符的百里香错误消息

如何将带有尾随x的数字字符串转换为无符号数字列表

将带有美元符号的字符串转换为数字

如何将数字转换为字符串

数字后带有减号的 CSV 文件。 “ValueError:无法将字符串转换为浮点数:”