如何在PL / SQL中将字符串转换为数字

时间:2011-12-06 05:44:58

标签: database string plsql numbers

我有5个字符串,可以有数字,小数点,字母和空格。如果字符串中的所有字符都是数字,我想将此字符串转换为数字(整数)。即。

  • 不允许小数点
  • 不允许+/-签名
  • 中间不允许有空格,但可以在极端情况下允许它们

提前致谢。

6 个答案:

答案 0 :(得分:16)

在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中,您可以使用LENGTHTRIMTRANSLATE函数检查字符串是否由数字字符组成。

LENGTH(TRIM(TRANSLATE(string1, ' +-.0123456789', ' ')))

答案 1 :(得分:3)

to_number函数将字符串转换为数字。

答案 2 :(得分:1)

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.

答案 3 :(得分:0)

您是否尝试过CAST(var AS NUMBER)?

答案 4 :(得分:0)

也可以试试这个

select floor(to_number(TRANSLATE(' +1234.34','+-',' '))) from dual;

假设+1234.34是输入

答案 5 :(得分:0)

假设您正在使用变量foo_code

IF TRIM(TRANSLATE(TRANSLATE(TRIM(foo_code), ' ', 'x'), '0123456789', ' ')) IS NULL THEN
  foo_number := TO_NUMBER(foo_code);
END IF;

打破它:

  • 修剪前导和尾随空格
  • 将任何内部空间翻译成'x' - 想一下测试用例'1234 098'(即打破第三个条件的简单字符串)
  • 将任何数字翻译成空格
  • 修剪前导和尾随空格
  • 如果一切都是数字,你应该留下一个空字符串,在Oracle术语中是空的