Как преобразовать строку в число в PL / SQL - PullRequest
12 голосов
/ 06 декабря 2011

У меня есть 5-символьная строка, которая может иметь цифры, десятичные точки, алфавиты и пробелы. Я хотел преобразовать эту строку в число (целое число), если все символы в строке являются числами. т.е.

  • Десятичные точки не допускаются
  • Знак +/- не разрешен
  • Пробелы не допускаются между ними, но они могут быть разрешены в крайних случаях

Заранее спасибо.

Ответы [ 6 ]

16 голосов
/ 06 декабря 2011

Используйте To_Number Function в PL / SQL для преобразования строки в число, см., Например, ниже.

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 

EDIT:

В PL / SQL вы можете проверить, состоит ли строка из числовых символов, используя функции LENGTH , TRIM и TRANSLATE .

LENGTH(TRIM(TRANSLATE(string1, ' +-.0123456789', ' ')))
3 голосов
/ 06 декабря 2011

to_number функция преобразует строку в число.

1 голос
/ 06 декабря 2011
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.
0 голосов
/ 06 декабря 2011

Предполагается, что вы работаете с переменной 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 равна NULL
0 голосов
/ 06 декабря 2011

Также попробуйте это вместо

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

Предположим, что +1234.34 является вводом

0 голосов
/ 06 декабря 2011

Вы пробовали CAST (var AS NUMBER)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...