2016-08-03 12 views
0

Ich muss Komma durch Punkt ersetzen und dann brauche ich meinen Wert, um eine Zahl zu sein. Also schrieb ich dies:Dezimaltrennzeichen Orakel

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

aber dann will ich to_number konvertieren, den Wert auf, und ich bekomme die Fehlermeldung:

"invalid number"

+0

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

+2

Mögliche Duplikat [NLS \ _NUMERIC \ _CHARACTERS Einstellung für Dezimal] (http://stackoverflow.com/questions/24571355/nls-numeric-characters-setting-for-decimal) – Mottor

Antwort

3

Die to_number() function nutzt die NLS_NUMERIC_CHARACTERS Einstellung der Sitzung zu entscheiden, wie Kommas und Punkte zu interpretieren . Wenn Sie wissen, dass Ihre Zeichenfolge immer ein Komma als Dezimaltrennzeichen hat, können Sie das als Teil des Aufrufs überschreiben, indem Sie das optionale dritte Argument verwenden. obwohl das bedeutet noch lange haben Sie das Format Modell angeben:

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

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

Sie keinen separaten replace() Schritt benötigen.

Sie können die Sitzungseinstellung auch mit ALTER SESSION SET NLS_NUMERIC_CHARACTERS=',.'; ändern, aber Sie können die Einstellung möglicherweise nicht in jedem Client steuern, der Ihren Code ausführen muss.

1

Das Dezimaltrennzeichen ist in Ihrem Gebietsschema definiert. Hier sieht es so aus als wäre es ,. Sie müssen also nicht den Ersatz zu tun, bevor die Zeichenfolge konvertieren:

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

Oder Ihr Gebietsschema ändern:

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