2011-04-05 3 views
7

string에서 decimal까지 고정 소수점 구분 기호 .을 문화 설정에 종속적으로 변환해야합니다. 다음으로, 나는 십진수가 . 다음에 소수점 이하 6 자리로 제한되며, 자릿수에 대한 제한은 . 앞에 없다는 것을 알고 있습니다. D 전에 9 문자의TO_NUMBER 함수 (고정 소수점 char 포함)를 사용하여 string을 Oracle 번호로 변환하는 방법?

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

번호가 최대 수를 허용 : 포맷 문자열은 Oracle 설명서와 예제를 사용하여 지금은 그냥이 해결책을 가지고 있습니다. 나는이 포맷 문자열을 꽤 끔찍한 것으로 생각한다. 이 일반적인 변환이나 함수의 두 번째 매개 변수를 생략하는 몇 가지 방법에 대한 더 나은 형식 문자열이 있습니까? 일반적으로 함수 NLS 매개 변수를 전달하여 소수 구분 기호 .으로 변환하려는 경우에만 전달해야하지만 두 번째 매개 변수도 필수입니다.

+0

문자열 형식의 숫자가 항상 '9999.99999'인 경우 TO_NUMBER()를 사용하지 않으시겠습니까? 소수점 뒤에 6 자리가있는 제약 조건을 넣고 싶습니까? – Chandu

+1

@cybernate :'to_number (: X)'는 세션의 NLS 설정에서 X를 구문 분석합니다. –

+0

@Vincent : 설명을위한 Thx ... – Chandu

답변

7

두 번째 매개 변수가 아닌 세 번째 매개 변수를 사용하여 to_number 함수를 호출 할 수 없습니다. "추한"형식 문자열을 패키지 상수에 넣고 잊어 버리는 것이 좋습니다.

dbms_session.set_nls을 사용하여 NLS 설정을 수정하고 to_number을 인수없이 사용할 수도 있습니다.

+1

+1 ... 또는 동일한 생각을 사용하여 자신 만의 (패키지 된) 함수 "our_to_number"를 만들고 구현 세부 사항을 모두 숨길 수 있습니다. –

+0

아마도 가장 확실한 해결책 일 것입니다. 나를 올바른 방법으로 만들고 있는지 Thx. – Tom

0
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; 
+2

러시아어 대신 영어로 의견을 쓸 수 있습니까? – j0k

+0

ПЯТЬ ЗНАКОВ ПОСЛЕ ЗАПЯТОЙ ДОСТАТОЧНО = 다섯 자릿수이면 충분합니다. –

-3
select to_number(' 12.5 ') + to_number(' 12 ') from dual; 
+0

이 질문에 어떻게 대답합니까? –

1

는 쉼표와 기간을 모두 처리합니다.

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