Når du bruger TO_CHAR()
funktion til at formatere et tal i Oracle, bruger du en formatmodel til at bestemme, hvordan tallet skal formateres.
For eksempel kan du formatere et tal som 12,345.00
eller gerne 12.345,00
, afhængigt af din lokalitet.
Formatmodellen kan inkludere G
eller D
formater elementer for at tilføje et komma til et tal. Hvilken du bruger afhænger af, om du vil have kommaet som et tusinde-separator eller som et decimaltegn.
Alternativt kan du bruge et faktisk kommategn (,
) hvis du foretrækker det, selvom denne metode ikke er lokalitetsbevidst som G
og D
formatelementer er.
G
og D
Formater elementer
Her er et eksempel til at demonstrere G
og D
formatelementer:
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Resultat:
12,345.00
I dette tilfælde udsender gruppeseparatoren et komma, og decimaltegnet udsender et punktum. Det er fordi min nuværende sessions NLS_TERRITORY
parameter er indstillet til Australia
.
Her er, hvad der sker, hvis jeg ændrer min NLS_TERRITORY
parameter til Germany
:
ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Resultat:
12,345.00
Nu bruges kommaet til decimaltegn.
Som en hurtig forklaring af ovenstående formatmodel:
fm
formatmodifikator undertrykker enhver udfyldning, der kan anvendes på resultatet.9
tegn repræsenterer tal.0
tegn repræsenterer tal uden at undertrykke nogen foranstillede eller efterfølgende nuller.
Her er en komplet liste over talformatelementer, som du kan bruge som en hurtig reference.
Than NLS_NUMERIC_CHARACTERS
Parameter
Når vi indstiller NLS_TERRITORY
parameter (som i det foregående eksempel), angiver dette implicit en masse andre parametre, inklusive NLS_NUMERIC_CHARACTERS
parameter.
Than NLS_NUMERIC_CHARACTERS
parameter bestemmer, hvilke tegn der bruges til gruppeseparator og decimaltegn.
Vi kan forespørge på V$NLS_PARAMETERS
visning for at se, hvilke tegn der bruges til gruppeseparator og decimaltegn:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_NUMERIC_CHARACTERS';
Resultat:
,.
Her ser vi, at decimaltegnet er repræsenteret med et komma, og gruppeseparatoren er repræsenteret af et punktum.
Du kan ændre værdien af NLS_NUMERIC_CHARACTERS
parameter direkte, hvis du vil (dvs. uden at ændre NLS_TERRITORY
parameter).
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Resultat:
12,345.00
Men du bør nok undgå at gøre dette, fordi det forårsager en afbrydelse mellem NLS-parametre. Dine NLS-parametre afspejler ikke længere standardværdierne for det aktuelle område. Medmindre du har en god grund til ikke at gøre det, er det normalt bedre at ændre NLS_TERRITORY
parameter til det relevante område, så andre parametre også kan opdateres til deres standard for det nye område.
'nlsparam'
Argument
En ting jeg bør nævne er, at T0_CHAR()
funktion accepterer et tredje argument, der gør det muligt midlertidigt at indstille forskellige NLS-parametre, inklusive NLS_NUMERIC_CHARACTERS
parameter. Når du gør dette på funktionsniveau, ændrer det ikke værdien af disse parametre for den aktuelle session.
Her er et eksempel:
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;
Resultat:
r1 r2 r3 ____________ ____________ ____________ 12.345,00 12,345.00 12.345,00
Her satte jeg sessionens territorium til Tyskland og kaldte derefter TO_CHAR()
tre gange.
- Det første opkald bruger sessionens NLS-parametre. Det betyder, at standardgruppeseparatoren er en periode.
- I det andet opkald indstillede jeg eksplicit min egen
NLS_NUMERIC_CHARACTERS
parameter inde fra funktionen. I dette tilfælde indstiller jeg gruppeseparatoren til at være et komma. At gøre dette påvirkede ikke min sessions NLS-parametre, som det ses af det tredje opkald. - Det tredje opkald bruger sessionens NLS-parametre, ligesom det første opkald. Som vi kan se, er gruppeseparatoren og decimaltegn ikke blevet påvirket af den (midlertidige) ændring, som vi foretog i vores andet opkald.
Hardkodet komma
En anden måde at tilføje et komma til et tal på er at hardkode det ind i din formatmodel.
Eksempel:
ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99,999.00')
FROM DUAL;
Resultat:
12,345.00
I dette tilfælde har jeg hårdkodet kommaet og punktum. Hvis du gør dette, ignoreres gruppeseparatoren indstillet i NLS_NUMERIC_CHARACTERS
parameter.
Flere kommaer
Du kan have flere kommaer og/eller gruppeseparatorer i en formatmodel.
Eksempel:
ALTER SESSION SET NLS_TERRITORY = 'Australia';
SELECT TO_CHAR(123456789, 'fm999G999G999D00')
FROM DUAL;
Resultat:
123,456,789.00
Ugyldig kommaplacering
Et komma- eller gruppeseparator kan ikke vises til højre for et decimaltegn eller et punktum i en talformatmodel.
SELECT TO_CHAR(12345, 'fm99D999G00')
FROM DUAL;
Resultat:
Error report - ORA-01481: invalid number format model