Как преобразовать из строки в число в Oracle, используя функцию числа с фиксированной десятичной запятой char?

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

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

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

4 ответов


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

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


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

FUNCTION to_number2(p_num_str VARCHAR2) RETURN NUMBER AS
BEGIN
  RETURN TO_NUMBER(REPLACE(p_num_str, ',', '.'), '999999999999D999999999999', 'NLS_NUMERIC_CHARACTERS=''.,''');
END;

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;

select to_number('   12.5   ') + to_number('   12   ') from dual;