I Oracle Database kan du formatera siffror på många sätt.
Du kan till exempel formatera ett tal som en valuta, med kommatecken och decimaler på rätt plats. Du kan ange inledande nollor, du kan lägga till en bråkdel – eller ta bort den, om det är vad som krävs.
Den här artikeln innehåller exempel på följande:
- Formatera siffror som valuta
- Lägg till en komma-/tusentalsavgränsare
- Inkludera decimaler
- Ta bort alla decimaler
- Lägg till inledande nollor till ett tal
Jag förklarar också hur formatering påverkas av din sessions NLS-parametrar.
NLS-initieringsparametrar bestämmer vilka tecken som används för gruppavgränsare, decimaltecken och valutasymbol i den aktuella sessionen. Du kan dra fördel av dessa parametrar för att mata ut språkmedveten formatering.
Du kan använda funktioner som TO_CHAR(number)
och till och med LPAD()
att konvertera siffror till en sträng och formatera dem precis som du vill i farten. Funktioner som CAST()
kan också ha en effekt på hur ett tal formateras, beroende på vilken datatyp det castas som.
Ett snabbt exempel
Här är ett snabbt exempel på hur du formaterar ett tal med TO_CHAR()
funktion:
SELECT
TO_CHAR(12345, 'fmL99G999D00')
FROM DUAL;
Resultat:
$12,345.00
fmL99G999D00
del är en formatmodell som bestämmer hur utdata ska formateras. Du kan ändra formatmodellen så att den passar dina behov.
Varje tecken i formatmodellen är ett formatelement och har en speciell betydelse. Du kan lägga till eller ta bort formatelement efter behov.
Här är en fullständig lista över formatelement som du kan använda för din formatmodell när du formaterar siffror.
Även om det är sant att du kan tillhandahålla en bokstavlig sträng för olika formatelement (till exempel ett dollartecken ($
) för dollar) förutsätter detta att valutan är denominerad i det hårdkodade värdet. Det finns många andra möjliga valutor runt om i världen, och formatelementen kan dynamiskt returnera den lokala valutasymbolen för användarens session.
Det är samma sak för gruppavgränsaren och decimaltecken. Olika lokaler använder olika konventioner. Genom att använda dessa språkmedvetna formatelement blir din kod mer portabel.
Även TO_CHAR()
funktionen låter dig skicka in dina egna NLS-parametrar i funktionen. Att göra det påverkar bara det funktionsanropet, så du kan ändra saker som valutasymboler i farten utan att behöva hårdkoda det i din formatmodell eller uppdatera NLS-parametrarna för din session.
Följande exempel visar mer detaljerat hur varje formatelement fungerar.
Formatera siffror som valuta
Här är ett exempel på hur du formaterar ett tal som valuta:
SELECT
TO_CHAR(12, 'fmL99')
FROM DUAL;
Resultat:
$12
I det här fallet använde jag L
formatelement för att ange symbolen för lokal valuta. Den lokala valutasymbolen bestäms av NLS_CURRENCY
parameter.
Du kan alternativt använda C
eller U
formatelement, som returnerar ISO-valutasymbolen respektive dubbelvalutasymbolen.
Se Hur man formaterar siffror som valuta i Oracle för mer information och exempel.
Lägg till en komma-/tusenavgränsare
Även om du alltid kan använda ett hårdkodat kommatecken för din tusentals/gruppseparator, tar detta inte hänsyn till länder som använder en punkt för sin gruppseparator. Det omvända är uppenbarligen sant. Dessutom separerar vissa länder tusentals grupper med ett tunt utrymme.
Du kan använda G
formatelement för att ange en gruppseparator. Detta returnerar dynamiskt den tillämpliga gruppseparatorn som anges i NLS_NUMERIC_CHARACTERS
parameter. Denna parameter bestämmer både gruppavgränsaren och decimaltecknet.
Exempel:
SELECT
TO_CHAR(12345, 'fm99G999')
FROM DUAL;
Resultat:
12,345
Här är ett annat exempel med ett större antal:
SELECT
TO_CHAR(123456789, 'fm999G999G999')
FROM DUAL;
Resultat:
123,456,789
Se Hur man formaterar ett nummer med kommatecken i Oracle för en mer detaljerad diskussion.
Inkludera decimaler
Även om det är sant att du kan hårdkoda ditt eget radixtecken (till exempel en punkt) i din formatmodell, kommer detta inte att tillgodose andra lokaler som använder ett annat tecken.
Du kan använda D
formatelement för att returnera decimal-/radixtecknet som anges i NLS_NUMERIC_CHARACTERS
parameter för den aktuella sessionen:
SELECT
TO_CHAR(7, 'fm9D00')
FROM DUAL;
Resultat:
7.00
I det här fallet använde jag två 0
formatera element efter tecknet radix. Detta formatelement returnerar avslutande nollor där det är tillämpligt.
Använda en 9
skulle undertrycka alla avslutande nollor i detta fall:
SELECT
TO_CHAR(7, 'fm9D99')
FROM DUAL;
Resultat:
7.
Men om vi tar bort fm
formatmodifierare får vi ett annat resultat:
SELECT
TO_CHAR(7, '9D99')
FROM DUAL;
Resultat:
7.00
fm
formatmodifierare undertrycker all utfyllnad som har tillämpats på resultatet. Genom att ta bort det blir vårt resultat vadderat. Den innehåller ett inledande mellanslag, eftersom det är dit ett negativt tecken skulle ha gått om talet hade varit negativt. Och den innehåller också avslutande nollor, eftersom vi angav två 9
formatelement.
Se 3 sätt att formatera ett tal till 2 decimaler i Oracle för fler idéer om hur man formaterar tal med decimaler.
Ta bort alla decimaler
Det finns flera sätt att formatera ett tal så att det inte har några decimaler. Ett uppenbart sätt är att helt enkelt ta bort decimaldelen från vår formatsträng:
SELECT
TO_CHAR(7, 'fm9')
FROM DUAL;
Resultat:
7
Men vi kan också använda andra funktioner, såsom ROUND()
, TRUNC()
och CAST()
för att uppnå samma eller liknande effekt.
Se 4 sätt att formatera ett tal utan decimaler i Oracle för exempel.
Lägg till inledande nollor
Vi har ett par alternativ när det gäller att lägga till inledande nollor till vårt nummer.
Återigen, håller fast vid TO_CHAR()
funktionen kan vi använda 0
formatelement för att returnera inledande och efterföljande nollor.
SELECT
TO_CHAR(7, 'fm000')
FROM DUAL;
Resultat:
007
Om vi hade använt 9
formatelement, skulle vi inte ha fått några inledande nollor:
SELECT
TO_CHAR(7, 'fm999')
FROM DUAL;
Resultat:
7
Men om vi tar bort fm
formatmodifierare, skulle vi ha fått ett mellanslag där varje inledande nolla skulle ha varit:
SELECT
TO_CHAR(7, '999')
FROM DUAL;
Resultat:
7
Ett annat sätt att formatera ett tal med inledande nollor är med LPAD()
fungera. Denna funktion tillämpar vänster utfyllnad på en sträng eller ett nummer. Du kan ange vilka tecken som ska användas för utfyllnaden, och om du använder en nolla kommer den att fyllas med nollor.
Se 2 sätt att formatera ett tal med ledande nollor i Oracle för ett exempel.
Hur man kontrollerar NLS-parametrarna
NLS-parametrarna (National Language Support) bestämmer det språkspecifika beteendet på både klienten och servern. Detta inkluderar parametrar som bestämmer vilka tecken som ska användas för gruppavgränsare, decimaltecken, valutasymboler osv.
Låt oss kontrollera det aktuella värdet på mina NLS-parametrar:
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öljande parametrar bestämmer formateringselement för siffror och valutor:
NLS_CURRENCY
NLS_ISO_CURRENCY
NLS_NUMERIC_CHARACTERS
NLS_DUAL_CURRENCY
Standardvärdet för dessa parametrar bestäms av NLS_TERRITORY
parameter. När vi ställer in värdet för NLS_TERRITORY
parameter, ställer detta implicit in värdet för olika andra parametrar (inklusive de fyra nämnda).
I mitt fall är mitt territorium Australien, så dessa fyra parametrar återspeglar hur siffror vanligtvis formateras i Australien. Om jag skulle ändra det till att säga, Tyskland, då skulle dessa fyra parametrar uppdateras för att återspegla formateringen för Tyskland.
Du kan dock uttryckligen ställa in varje parameter individuellt. Detta låter dig åsidosätta värdet som implicit ställts in av NLS_TERRITORY
parameter.