Как преобразовать строку в число в PL/SQL

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

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

Спасибо заранее.

Ответ 1

Используйте 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', ' ')))

Ответ 2

Функция

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

Ответ 3

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.

Ответ 4

Вы пытались использовать CAST (var AS NUMBER)?

Ответ 5

Также попробуйте это вместо выберите пол (to_number (TRANSLATE ('+1234.34', '+ -', ''))) из dual; Предположим, что +1234.34 - это вход

Ответ 6

Предполагая, что вы работаете с переменной foo_code

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

сломать его:

  • Обрезать передние и конечные пробелы
  • Переведите любые внутренние пробелы в "х" - подумайте о тестовом примере "1234 098" (т.е. простая строка, нарушающая третье условие)
  • перевод любых цифр в пробелы
  • Обрезать передние и конечные пробелы
  • Если все было числовым, вы должны остаться с пустой строкой, которая в терминах Oracle равна NULL