【发布时间】:2012-01-13 19:35:24
【问题描述】:
我有 5 个字符串,可以包含数字、小数点、字母和空格。如果字符串中的所有字符都是数字,我想将此字符串转换为数字(整数)。即
- 不允许小数点
- 不允许 +/- 符号
- 中间不允许有空格,但可以在极端情况下允许使用空格
提前致谢。
【问题讨论】:
标签: database string plsql numbers
我有 5 个字符串,可以包含数字、小数点、字母和空格。如果字符串中的所有字符都是数字,我想将此字符串转换为数字(整数)。即
提前致谢。
【问题讨论】:
标签: database string plsql numbers
也可以试试这个
select floor(to_number(TRANSLATE(' +1234.34','+-',' '))) from dual;
假设 +1234.34 是输入
【讨论】:
create or replace function is_int(p_str in varchar2) return number as
begin
if regexp_instr(p_str, '^[[:space:]]*[[:digit:]]{1,5}[[:space:]]*$') > 0 then
return 1;
end if;
return 0;
end;
/
show errors
with strings as (
select '12345' as string from dual
union all
select '1234' as string from dual
union all
select '123' as string from dual
union all
select '12' as string from dual
union all
select '1' as string from dual
union all
select '01' as string from dual
union all
select '' as string from dual
union all
select ' 345' as string from dual
union all
select '123 ' as string from dual
union all
select '12.45' as string from dual
union all
select '12 45' as string from dual
union all
select '12,45' as string from dual
union all
select '-1234' as string from dual
union all
select '+1234' as string from dual
union all
select 'A2345' as string from dual
)
select testcase, to_number(string)
from strings
where is_int(string) = 1
;
TESTCASE TO_NUMBER(STRING)
---------- -----------------
1 12345
2 1234
3 123
4 12
5 1
6 1
8 345
9 123
8 rows selected.
create or replace function to_int(p_str in varchar2) return number as
begin
if regexp_instr(p_str, '^[[:space:]]*[[:digit:]]{1,5}[[:space:]]*$') > 0 then
return to_number(p_str);
end if;
return null;
end;
/
show errors
with strings as (
select 1 as testcase, '12345' as string from dual
union all
select 2, '1234' as string from dual
union all
select 3, '123' as string from dual
union all
select 4, '12' as string from dual
union all
select 5, '1' as string from dual
union all
select 6, '01' as string from dual
union all
select 7, '' as string from dual
union all
select 8, ' 345' as string from dual
union all
select 9, '123 ' as string from dual
union all
select 10, '12.45' as string from dual
union all
select 11, '12 45' as string from dual
union all
select 12, '12,45' as string from dual
union all
select 13, '-1234' as string from dual
union all
select 14, '+1234' as string from dual
union all
select 15, 'A2345' as string from dual
)
select testcase, '''' || string || '''' as string
from strings
where to_int(string) is not null
;
TESTCASE STRING
---------- ---------------------
1 '12345'
2 '1234'
3 '123'
4 '12'
5 '1'
6 '01'
8 ' 345'
9 '123 '
8 rows selected.
【讨论】:
假设您正在使用变量foo_code
IF TRIM(TRANSLATE(TRANSLATE(TRIM(foo_code), ' ', 'x'), '0123456789', ' ')) IS NULL THEN
foo_number := TO_NUMBER(foo_code);
END IF;
分解:
【讨论】:
to_number 函数将字符串转换为数字。
【讨论】:
在 PL/SQL 中使用To_Number Function 将字符串转换为数字,示例如下。
to_number('1210.73', '9999.99') would return the number 1210.73
to_number('546', '999') would return the number 546
to_number('23', '99') would return the number 23
编辑:
在 PL/SQL 中,您可以使用 LENGTH、TRIM 和 TRANSLATE 函数检查字符串是否由数字字符组成。
LENGTH(TRIM(TRANSLATE(string1, ' +-.0123456789', ' ')))
【讨论】:
您尝试过 CAST(var AS NUMBER) 吗?
【讨论】: