I Oracle Database kan du formatere tal på mange måder.
For eksempel kan du formatere et tal som en valuta, med kommaer og decimaler på det rigtige sted. Du kan angive foranstillede nuller, du kan tilføje en brøkdel – eller fjerne den, hvis det er det, der kræves.
Denne artikel indeholder eksempler på følgende:
- Formatér tal som valuta
- Tilføj et komma/tusinde-separator
- Medtag decimaler
- Fjern alle decimaler
- Tilføj indledende nuller til et tal
Jeg forklarer også, hvordan formatering påvirkes af din sessions NLS-parametre.
NLS initialiseringsparametre bestemmer, hvilke tegn der bruges til gruppeseparator, decimaltegn og valutasymbol i den aktuelle session. Du kan drage fordel af disse parametre til at udlæse lokalitetsbevidst formatering.
Du kan bruge funktioner som TO_CHAR(number)
og endda LPAD()
at konvertere tal til en streng og formatere dem nøjagtigt, som du har lyst, når du er på farten. Funktioner som CAST()
kan også have en effekt på, hvordan et tal formateres, afhængigt af den datatype, det bliver castet som.
Et hurtigt eksempel
Her er et hurtigt eksempel på formatering af et tal ved hjælp af TO_CHAR()
funktion:
SELECT
TO_CHAR(12345, 'fmL99G999D00')
FROM DUAL;
Resultat:
$12,345.00
fmL99G999D00
del er en formatmodel, der bestemmer, hvordan outputtet skal formateres. Du kan ændre formatmodellen, så den passer til dine behov.
Hvert tegn i formatmodellen er et formatelement og har en særlig betydning. Du kan tilføje eller fjerne formatelementer efter behov.
Her er en komplet liste over formatelementer, som du kan bruge til din formatmodel, når du formaterer tal.
Selvom det er rigtigt, at du kan angive en streng bogstavelig for forskellige formatelementer (f.eks. et dollartegn ($
) for dollars), forudsætter dette, at valutaen er denomineret i den hårdkodede værdi. Der er mange andre mulige valutaer rundt om i verden, og formatelementerne er i stand til dynamisk at returnere det lokale valutasymbol for brugerens session.
Det er det samme for gruppeseparatoren og decimaltegn. Forskellige lokaliteter bruger forskellige konventioner. Brug af disse lokalitetsbevidste formatelementer gør din kode mere bærbar.
Også TO_CHAR()
funktionen giver dig mulighed for at indtaste dine egne NLS-parametre i funktionen. Hvis du gør det, påvirker det kun det funktionskald, så du kan ændre ting som f.eks. valutasymboler i farten uden at skulle hardkode det ind i din formatmodel eller opdatere NLS-parametrene for din session.
De følgende eksempler viser, hvordan hvert formatelement fungerer mere detaljeret.
Formatér tal som valuta
Her er et eksempel på formatering af et tal som valuta:
SELECT
TO_CHAR(12, 'fmL99')
FROM DUAL;
Resultat:
$12
I dette tilfælde brugte jeg L
formatelement for at angive det lokale valutasymbol. Det lokale valutasymbol bestemmes af NLS_CURRENCY
parameter.
Du kan alternativt bruge C
eller U
formatelementer, som returnerer henholdsvis ISO-valutasymbolet og dobbeltvalutasymbolet.
Se Sådan formateres tal som valuta i Oracle for mere information og eksempler.
Tilføj en komma-/tusinderseparator
Selvom du altid kan bruge et hårdkodet komma til din tusinder/gruppeseparator, tager dette ikke højde for lande, der bruger et punktum for deres gruppeseparator. Det omvendte er åbenbart sandt. Nogle lande adskiller også tusindvis af grupper med et tyndt mellemrum.
Du kan bruge G
formatelement for at angive en gruppeseparator. Dette returnerer dynamisk den relevante gruppeseparator som angivet i NLS_NUMERIC_CHARACTERS
parameter. Denne parameter bestemmer både gruppeseparatoren og decimaltegn.
Eksempel:
SELECT
TO_CHAR(12345, 'fm99G999')
FROM DUAL;
Resultat:
12,345
Her er et andet eksempel med et større tal:
SELECT
TO_CHAR(123456789, 'fm999G999G999')
FROM DUAL;
Resultat:
123,456,789
Se Sådan formateres et tal med komma i Oracle for en mere detaljeret diskussion.
Medtag decimaler
Selvom det er rigtigt, at du kan hardkode dit eget radix-tegn (for eksempel et punktum) i din formatmodel, vil dette ikke tage højde for andre lokaliteter, der bruger et andet tegn.
Du kan bruge D
formatelement for at returnere decimal-/radix-tegnet, der er angivet i NLS_NUMERIC_CHARACTERS
parameter for den aktuelle session:
SELECT
TO_CHAR(7, 'fm9D00')
FROM DUAL;
Resultat:
7.00
I dette tilfælde brugte jeg to 0
formater elementer efter radix-tegnet. Dette formatelement returnerer efterfølgende nuller, hvor det er relevant.
Brug af en 9
ville undertrykke eventuelle efterfølgende nuller i dette tilfælde:
SELECT
TO_CHAR(7, 'fm9D99')
FROM DUAL;
Resultat:
7.
Men hvis vi fjerner fm
formatmodifikator, får vi et andet resultat:
SELECT
TO_CHAR(7, '9D99')
FROM DUAL;
Resultat:
7.00
fm
formatmodifikator undertrykker enhver udfyldning, der er blevet anvendt på resultatet. Ved at fjerne det, er vores resultat polstret. Den indeholder et indledende mellemrum, fordi det er her, et negativt fortegn ville være gået, hvis tallet havde været negativt. Og den indeholder også efterfølgende nuller, fordi vi specificerede to 9
formatelementer.
Se 3 måder at formatere et tal til 2 decimaler i Oracle for at få flere ideer til, hvordan man formaterer tal med decimaler.
Fjern alle decimaler
Der er flere måder at formatere et tal på, så det ikke har nogen decimaler. En oplagt måde er simpelthen at fjerne decimaldelen fra vores formatstreng:
SELECT
TO_CHAR(7, 'fm9')
FROM DUAL;
Resultat:
7
Men vi kan også bruge andre funktioner, såsom ROUND()
, TRUNC()
og CAST()
for at opnå den samme eller lignende effekt.
Se 4 måder at formatere et tal uden decimaler på i Oracle for eksempler.
Tilføj førende nuller
Vi har et par muligheder, når det kommer til at tilføje indledende nuller til vores nummer.
Igen, holde sig til TO_CHAR()
funktion, kan vi bruge 0
formatelement for at returnere indledende og efterfølgende nuller.
SELECT
TO_CHAR(7, 'fm000')
FROM DUAL;
Resultat:
007
Hvis vi havde brugt 9
formatelement, ville vi ikke have fået nogen foranstillede nuller:
SELECT
TO_CHAR(7, 'fm999')
FROM DUAL;
Resultat:
7
Men hvis vi fjerner fm
formatmodifikator, ville vi have fået et mellemrum, hvor et hvilket som helst indledende nul ville have været:
SELECT
TO_CHAR(7, '999')
FROM DUAL;
Resultat:
7
En anden måde at formatere et tal med foranstillede nuller er med LPAD()
fungere. Denne funktion anvender venstre polstring på en streng eller et tal. Du kan angive hvilke tegn, der skal bruges til udfyldningen, og hvis du bruger et nul, vil det blive udfyldt med nuller.
Se 2 måder at formatere et tal med førende nuller i Oracle for et eksempel.
Sådan kontrolleres NLS-parametrene
NLS-parametrene (National Language Support) bestemmer den lokalespecifikke adfærd på både klienten og serveren. Dette inkluderer parametre, der bestemmer, hvilke tegn der skal bruges til gruppeseparator, decimaltegn, valutasymboler osv.
Lad os tjekke den aktuelle værdi af mine NLS-parametre:
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS;
Resultat:
PARAMETER VALUE __________________________ _________________________________ NLS_LANGUAGE ENGLISH NLS_TERRITORY AUSTRALIA NLS_CURRENCY $ NLS_ISO_CURRENCY AUSTRALIA NLS_NUMERIC_CHARACTERS ., NLS_CALENDAR GREGORIAN NLS_DATE_FORMAT DD/MON/RR NLS_DATE_LANGUAGE ENGLISH NLS_CHARACTERSET AL32UTF8 NLS_SORT BINARY NLS_TIME_FORMAT HH12:MI:SSXFF AM NLS_TIMESTAMP_FORMAT DD/MON/RR HH12:MI:SSXFF AM NLS_TIME_TZ_FORMAT HH12:MI:SSXFF AM TZR NLS_TIMESTAMP_TZ_FORMAT DD/MON/RR HH12:MI:SSXFF AM TZR NLS_DUAL_CURRENCY $ NLS_NCHAR_CHARACTERSET AL16UTF16 NLS_COMP BINARY NLS_LENGTH_SEMANTICS BYTE NLS_NCHAR_CONV_EXCP FALSE
Følgende parametre bestemmer formateringselementer for tal og valutaer:
NLS_CURRENCY
NLS_ISO_CURRENCY
NLS_NUMERIC_CHARACTERS
NLS_DUAL_CURRENCY
Standardværdien for disse parametre bestemmes af NLS_TERRITORY
parameter. Når vi indstiller værdien af NLS_TERRITORY
parameter, sætter dette implicit værdien for forskellige andre parametre (inklusive de fire nævnte).
I mit tilfælde er mit territorium Australien, og derfor afspejler disse fire parametre, hvordan tal typisk er formateret i Australien. Hvis jeg skulle ændre det til at sige, Tyskland, så ville disse fire parametre blive opdateret for at afspejle formateringen for Tyskland.
Du kan dog udtrykkeligt indstille hver parameter individuelt. Dette giver dig mulighed for at tilsidesætte den værdi, der implicit blev angivet af NLS_TERRITORY
parameter.