ti-enxame.com

Como converter uma string em número no PL / SQL

Eu tenho 5 caracteres que podem ter números, pontos decimais, alfabetos e espaços. Eu queria converter essa string em um número (número inteiro) se todos os caracteres na string fossem números. isto é.

  • Não são permitidos pontos decimais
  • Nenhum sinal de +/- permitido
  • Espaços não são permitidos no meio, mas podem ser permitidos em extremos

Desde já, obrigado.

12
Mayur

Use To_Number Function em PL/SQL para converter uma string em número, veja abaixo, por exemplo.

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 

EDITAR:

No PL/SQL, você pode verificar se uma sequência consiste em caracteres numéricos ou não, usando LENGTH , TRIM e CONVERTE funções.

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

to_number função converte uma string em um número.

3
CloudyMarble
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.
1
user272735

Tente também isso

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

Suponha que +1234,34 é a entrada

0
Manoj

Você tentou o CAST (var AS NUMBER)?

0
StilesCrisis

Supondo que você esteja trabalhando com uma variável foo_code

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

dividindo:

  • Apare os espaços iniciais e finais
  • Traduzir qualquer espaço interno em um 'x' - pense no caso de teste '1234 098' (ou seja, uma sequência simples que quebra a terceira condição)
  • traduza qualquer dígito em espaços
  • Apare os espaços iniciais e finais
  • Se tudo fosse numérico, você deveria ficar com uma string vazia, que nos termos do Oracle é NULL
0
Steve Bosman