2016-08-03 138 views
0

我需要用點替換逗號,然後我需要我的值爲數字。 所以我寫了這一點:十進制分隔符oracle

select replace('12345,6789', ',' , '.') from dual --it works fine 

但後來我想轉換to_number是價值,我得到的錯誤:

"invalid number"

+0

http://stackoverflow.com/search?q=NLS_NUMERIC_CHARACTERS – Mottor

+2

的可能的複製[NLS \ _NUMERIC \ _CHARACTERS設置爲十進制](http://stackoverflow.com/questions/24571355/nls-numeric-characters-setting-for-decimal) – Mottor

回答

3

to_number() function使用會話的NLS_NUMERIC_CHARACTERS設置,以決定如何解釋逗號和句號。如果您知道您的字符串將始終以逗號作爲小數分隔符,那麼可以使用可選的第三個參數將其作爲調用的一部分進行覆蓋;雖然這並不意味着你必須指定格式模型:

select to_number('12345,6789', '9999999999D9999', 'NLS_NUMERIC_CHARACTERS='',.''') 
from dual; 

TO_NUMBER('12345,6789','9999999999D9999 
--------------------------------------- 
          12345.6789 

你並不需要一個單獨的replace()一步。

您也可以使用ALTER SESSION SET NLS_NUMERIC_CHARACTERS=',.';更改會話的設置,但是您可能無法控制必須運行代碼的每個客戶端的設置。

1

小數點分隔符在您的語言環境中定義。這看起來像是,。所以,你不必將你的字符串前做替換:

select to_number('12345.6789') from dual --should work already 

或更改您的區域設置:

alter session set NLS_NUMERIC_CHARACTERS= '.,'; 
select to_number('123'||'.'||'456') from dual; 
select to_number(replace('12345,6789', ',' , '.')) from dual 
相關問題