Как преобразовать из строки в число в Oracle, используя функцию TO_NUMBER с фиксированной десятичной запятой char? - PullRequest
7 голосов
/ 05 апреля 2011

Мне нужно конвертировать в процедуре от string до decimal с фиксированным десятичным разделителем . независимо от настроек культуры.Далее, я знаю, что десятичное число ограничено 6 знаками после ., и количество цифр до . не ограничено.Используя документацию Oracle и ее примеры для строк форматирования, у меня теперь есть только это решение:

v_number := TO_NUMBER(v_string, '9999999999999999999999999999999999D999999', 'NLS_NUMERIC_CHARACTERS = ''. ''');

Количество символов 9 до D максимально допустимое числоЯ считаю эту строку формата довольно ужасной.Есть ли лучшая строка формата для этого общего преобразования или какой-либо способ пропустить второй параметр функции?В общем, мне просто нужно перейти к параметру функции NLS, чтобы сказать, что я просто хочу преобразовать с десятичным разделителем ., но второй параметр также обязателен в этом случае.

Ответы [ 4 ]

8 голосов
/ 05 апреля 2011

Вы не можете вызвать функцию to_number с третьим параметром, а не со вторым. Я бы предложил поместить «уродливую» строку формата в константу пакета и забыть об этом.

Вы также можете использовать dbms_session.set_nls, чтобы изменить настройки NLS и использовать to_number без аргументов.

1 голос
/ 07 декабря 2017

Обрабатывает запятую и точку.

FUNCTION to_number2(p_num_str VARCHAR2) RETURN NUMBER AS
BEGIN
  RETURN TO_NUMBER(REPLACE(p_num_str, ',', '.'), '999999999999D999999999999', 'NLS_NUMERIC_CHARACTERS=''.,''');
END;
0 голосов
/ 21 января 2015
select to_number('   12.5   ') + to_number('   12   ') from dual;
0 голосов
/ 04 ноября 2012
CREATE OR REPLACE FUNCTION IS_NUMBER(P_VAR IN VARCHAR2)
RETURN NUMBER
IS
  P_NUMBER NUMBER := 0;
  RIG VARCHAR2(10) := '';
  FORMAT VARCHAR2(100) := '999999999999D999999999999';
  RES VARCHAR2(100) := '';
BEGIN
  SELECT VALUE INTO RIG 
  FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_NUMERIC_CHARACTERS';
IF SUBSTR(RIG,1,1) = '.' THEN
 RES := REPLACE(P_VAR,',','.');
ELSE
 RES := REPLACE(P_VAR,'.',',');
END IF;
 P_NUMBER := TO_NUMBER(RES,FORMAT,'NLS_NUMERIC_CHARACTERS='''||RIG||'''');
 P_NUMBER := ROUND(P_NUMBER,5); --FIVE DIGITS AFTER DECIMAL POINT IS ENOUGH
RETURN P_NUMBER;
EXCEPTION
 WHEN OTHERS THEN RETURN -1;
END;
...