2011-04-05 43 views
7

我需要在步驟stringdecimal之間轉換,固定小數分隔符.獨立於文化設置。接下來,我知道.之後的十進制數字僅限於小數點後6位,並且.之前的位數沒有限制。使用Oracle文檔和示例對格式字符串我現在只是這個解決方案:D9字符如何使用具有固定小數點字符的TO_NUMBER函數從字符串轉換爲數字字符?

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

數量是允許的最大數量。我覺得這個格式字符串非常糟糕。有沒有更好的格式字符串爲這個一般轉換或某種方式省略函數的第二個參數?一般來說,我只需要傳遞函數NLS參數來告訴它,我只是想用十進制分隔符.進行轉換,但第二個參數在這種情況下也是強制性的。

+0

如果字符串形式的數字總是像'9999.99999'那麼您爲什麼不簡單地使用TO_NUMBER()?你想在小數點後面加上6位數的約束嗎? – Chandu 2011-04-05 13:13:27

+1

@cybernate:'to_number(:X)'將在會話的NLS設置中解析X,它可能與「。」有不同的數字分隔符。 – 2011-04-05 13:31:19

+0

@Vincent:Thx的澄清...... – Chandu 2011-04-05 13:40:28

回答

7

您不能用第三個參數調用to_number函數,而不是第二個參數。我會建議把「醜陋的」格式字符串放在一個包中,並忘記它。

您也可以使用dbms_session.set_nls修改您的NLS設置,並且無需參數即可使用to_number

+1

+1 ...或者,使用同樣的思路,您可以創建自己的(封裝)函數「our_to_number」,並完全隱藏實現細節。 – 2011-04-05 14:29:46

+0

可能是最清晰的解決方案。 Thx讓我確信自己在正確的道路上。 – Tom 2011-04-06 08:20:30

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 2012-11-04 17:08:00

+0

ПЯТЬЗНАКОВПОСЛЕЗАПЯТОЙДОСТАТОЧНО=五位小數就足夠了。 – 2013-12-03 11:12:18

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

這是如何回答這個問題的? – 2015-01-21 12:33:07

1

把手逗號和週期。

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