Wenn Sie TO_CHAR()
verwenden Um eine Zahl in Oracle zu formatieren, verwenden Sie ein Formatmodell, um zu bestimmen, wie die Zahl formatiert werden soll.
Beispielsweise könnten Sie eine Zahl wie 12,345.00
formatieren oder wie 12,345.00
, abhängig von Ihrem Gebietsschema.
Das Formatmodell kann den G
enthalten oder D
format-Elemente, um einer Zahl ein Komma hinzuzufügen. Welche Sie verwenden, hängt davon ab, ob Sie das Komma als Tausendertrennzeichen oder als Dezimalzeichen verwenden möchten.
Alternativ können Sie ein echtes Kommazeichen verwenden (,
), wenn Sie es vorziehen, obwohl diese Methode nicht wie G
gebietsschemaabhängig ist und D
Formatelemente sind.
Das G
und D
Formatelemente
Hier ist ein Beispiel zur Veranschaulichung des G
und D
Formatelemente:
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Ergebnis:
12,345.00
In diesem Fall gibt das Gruppentrennzeichen ein Komma und das Dezimalzeichen einen Punkt aus. Das liegt daran, dass meine aktuelle Sitzung NLS_TERRITORY
ist Parameter ist auf Australia
gesetzt .
Folgendes passiert, wenn ich mein NLS_TERRITORY
ändere Parameter auf Germany
:
ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Ergebnis:
12,345.00
Jetzt wird das Komma für das Dezimalzeichen verwendet.
Zur schnellen Erklärung des obigen Formatmodells:
- Der
fm
Der Formatmodifikator unterdrückt jegliches Padding, das auf das Ergebnis angewendet werden könnte. - Die
9
Zeichen stehen für Zahlen. - Die
0
Zeichen stellt Zahlen dar, ohne führende oder nachgestellte Nullen zu unterdrücken.
Hier ist eine vollständige Liste der Zahlenformatelemente, die Sie als Kurzreferenz verwenden können.
Tdie NLS_NUMERIC_CHARACTERS
Parameter
Wenn wir NLS_TERRITORY
setzen -Parameter (wie im vorherigen Beispiel), setzt dies implizit eine Reihe anderer Parameter, einschließlich NLS_NUMERIC_CHARACTERS
Parameter.
Tdie NLS_NUMERIC_CHARACTERS
Parameter bestimmt, welche Zeichen für das Gruppentrennzeichen und das Dezimalzeichen verwendet werden.
Wir können die V$NLS_PARAMETERS
abfragen Ansicht, um zu sehen, welche Zeichen für das Gruppentrennzeichen und das Dezimalzeichen verwendet werden:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_NUMERIC_CHARACTERS';
Ergebnis:
,.
Hier sehen wir, dass das Dezimalzeichen durch ein Komma und das Gruppentrennzeichen durch einen Punkt dargestellt wird.
Sie können den Wert von NLS_NUMERIC_CHARACTERS
ändern Parameter direkt, wenn Sie möchten (d.h. ohne das NLS_TERRITORY
zu ändern Parameter).
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Ergebnis:
12,345.00
Dies sollten Sie jedoch wahrscheinlich vermeiden, da dies zu einer Unterbrechung zwischen den NLS-Parametern führt. Ihre NLS-Parameter spiegeln nicht mehr die Standardwerte für das aktuelle Gebiet wider. Sofern Sie keinen triftigen Grund dagegen haben, ist es normalerweise besser, NLS_TERRITORY
zu ändern Parameter auf das relevante Gebiet, sodass auch andere Parameter auf ihre Standardwerte für das neue Gebiet aktualisiert werden können.
Der 'nlsparam'
Argument
Eine Sache, die ich erwähnen sollte, ist, dass T0_CHAR()
Die Funktion akzeptiert ein drittes Argument, mit dem Sie vorübergehend verschiedene NLS-Parameter festlegen können, einschließlich der NLS_NUMERIC_CHARACTERS
Parameter. Wenn Sie dies auf Funktionsebene tun, wird der Wert dieser Parameter für die aktuelle Sitzung nicht geändert.
Hier ist ein Beispiel:
ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT
TO_CHAR(12345, 'fm99G999D00') AS "r1",
TO_CHAR(
12345, 'fm99G999D00',
'NLS_NUMERIC_CHARACTERS = ''.,'''
) AS "r2",
TO_CHAR(12345, 'fm99G999D00') AS "r3"
FROM DUAL;
Ergebnis:
r1 r2 r3 ____________ ____________ ____________ 12.345,00 12,345.00 12.345,00
Hier habe ich das Gebiet der Sitzung auf Deutschland festgelegt und dann TO_CHAR()
aufgerufen dreimal.
- Der erste Aufruf verwendet die NLS-Parameter der Sitzung. Das bedeutet, dass das standardmäßige Gruppentrennzeichen ein Punkt ist.
- Im zweiten Aufruf setze ich explizit meine eigenen
NLS_NUMERIC_CHARACTERS
Parameter innerhalb der Funktion. In diesem Fall setze ich das Gruppentrennzeichen auf ein Komma. Wie der dritte Aufruf zeigt, hatte dies keine Auswirkungen auf die NLS-Parameter meiner Sitzung. - Der dritte Aufruf verwendet die NLS-Parameter der Sitzung, genau wie der erste Aufruf. Wie wir sehen können, sind das Gruppentrennzeichen und das Dezimalzeichen von der (vorübergehenden) Änderung, die wir in unserem zweiten Aufruf vorgenommen haben, nicht betroffen.
Fest codiertes Komma
Eine andere Möglichkeit, einer Zahl ein Komma hinzuzufügen, besteht darin, sie in Ihrem Formatmodell fest zu codieren.
Beispiel:
ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99,999.00')
FROM DUAL;
Ergebnis:
12,345.00
In diesem Fall habe ich das Komma und den Punkt fest codiert. Dadurch wird das in NLS_NUMERIC_CHARACTERS
festgelegte Gruppentrennzeichen ignoriert Parameter.
Mehrere Kommas
Innerhalb eines Formatmodells können mehrere Kommas und/oder Gruppentrennzeichen vorhanden sein.
Beispiel:
ALTER SESSION SET NLS_TERRITORY = 'Australia';
SELECT TO_CHAR(123456789, 'fm999G999G999D00')
FROM DUAL;
Ergebnis:
123,456,789.00
Ungültige Kommaplatzierung
Ein Komma oder Gruppentrennzeichen darf in einem Zahlenformatmodell nicht rechts von einem Dezimalzeichen oder Punkt stehen.
SELECT TO_CHAR(12345, 'fm99D999G00')
FROM DUAL;
Ergebnis:
Error report - ORA-01481: invalid number format model