V databázi Oracle můžete formátovat čísla mnoha způsoby.
Můžete například naformátovat číslo jako měnu s čárkami a desetinnými čárkami na správném místě. Můžete zadat úvodní nuly, přidat zlomkovou část – nebo ji odstranit, pokud je to nutné.
Tento článek obsahuje následující příklady:
- Formátovat čísla jako měnu
- Přidejte čárku/oddělovač tisíců
- Uveďte desetinná místa
- Odeberte všechna desetinná místa
- Přidejte k číslu úvodní nuly
Vysvětlím také, jak je formátování ovlivněno parametry NLS vaší relace.
Inicializační parametry NLS určují, které znaky se použijí pro oddělovač skupiny, desetinný znak a symbol měny v aktuální relaci. Tyto parametry můžete využít k výstupu formátování podle národního prostředí.
Můžete použít funkce jako TO_CHAR(number)
a dokonce LPAD()
převést čísla na řetězec a formátovat je přesně tak, jak chcete, za běhu. Funkce jako CAST()
může mít také vliv na to, jak je číslo formátováno, v závislosti na datovém typu, do kterého je přetypováno.
Rychlý příklad
Zde je rychlý příklad formátování čísla pomocí TO_CHAR()
funkce:
SELECT
TO_CHAR(12345, 'fmL99G999D00')
FROM DUAL;
Výsledek:
$12,345.00
fmL99G999D00
část je model formátu, který určuje, jak má být výstup formátován. Model formátu můžete změnit tak, aby vyhovoval vašim požadavkům.
Každý znak v modelu formátu je prvkem formátu a má zvláštní význam. Podle potřeby můžete přidat nebo odebrat prvky formátu.
Zde je úplný seznam prvků formátu, které můžete použít pro svůj model formátu při formátování čísel.
I když je pravda, že můžete zadat řetězcový literál pro různé formátové prvky (například znak dolaru ($
) pro dolary), předpokládá se, že měna je denominována v této pevně zakódované hodnotě. Na světě existuje mnoho dalších možných měn a prvky formátu jsou schopny dynamicky vracet symbol místní měny pro relaci uživatele.
Je to stejné pro oddělovač skupiny a desetinný znak. Různá národní prostředí používají různé konvence. Pomocí těchto prvků formátu s vědomím národního prostředí je váš kód přenosnější.
Také TO_CHAR()
Funkce umožňuje předat v rámci funkce vlastní parametry NLS. Pokud tak učiníte, ovlivní to pouze volání funkce, takže věci, jako jsou symboly měn, můžete měnit za chodu, aniž byste je museli napevno kódovat do modelu formátu nebo aktualizovat parametry NLS pro vaši relaci.
Následující příklady podrobněji ukazují, jak jednotlivé prvky formátu fungují.
Formátovat čísla jako měnu
Zde je příklad formátování čísla jako měny:
SELECT
TO_CHAR(12, 'fmL99')
FROM DUAL;
Výsledek:
$12
V tomto případě jsem použil L
formátovací prvek pro určení symbolu místní měny. Symbol místní měny je určen NLS_CURRENCY
parametr.
Alternativně můžete použít C
nebo U
formátovací prvky, které vracejí symbol měny ISO a symbol duální měny.
Další informace a příklady naleznete v části Jak formátovat čísla jako měnu v Oracle.
Přidejte oddělovač čárka/tisíce
I když můžete vždy použít pevně zakódovanou čárku pro oddělovač tisíců/skupin, nebere to v úvahu země, které pro oddělovač skupin používají tečku. Opak je zjevně pravdou. Některé země také oddělují tisíce skupin tenkou mezerou.
Můžete použít G
format element k určení oddělovače skupiny. To dynamicky vrátí příslušný oddělovač skupin, jak je uvedeno v NLS_NUMERIC_CHARACTERS
parametr. Tento parametr určuje jak oddělovač skupiny, tak desetinný znak.
Příklad:
SELECT
TO_CHAR(12345, 'fm99G999')
FROM DUAL;
Výsledek:
12,345
Zde je další příklad s větším číslem:
SELECT
TO_CHAR(123456789, 'fm999G999G999')
FROM DUAL;
Výsledek:
123,456,789
Podrobnější diskusi naleznete v části Jak formátovat číslo pomocí čárky v Oracle.
Zahrnout desetinná místa
I když je pravda, že do svého formátovacího modelu můžete napevno zakódovat svůj vlastní radixový znak (například tečku), nebude to vyhovovat jiným lokalitám, které používají jiný znak.
Můžete použít D
formátovací prvek pro vrácení desetinného/radixového znaku, který je uveden v NLS_NUMERIC_CHARACTERS
parametr pro aktuální relaci:
SELECT
TO_CHAR(7, 'fm9D00')
FROM DUAL;
Výsledek:
7.00
V tomto případě jsem použil dvě 0
formátování prvků za znakem radix. Tento prvek formátu tam, kde je to možné, vrací koncové nuly.
Pomocí 9
by v tomto případě potlačil všechny koncové nuly:
SELECT
TO_CHAR(7, 'fm9D99')
FROM DUAL;
Výsledek:
7.
Pokud však odstraníme fm
modifikátor formátu, dostaneme jiný výsledek:
SELECT
TO_CHAR(7, '9D99')
FROM DUAL;
Výsledek:
7.00
fm
Modifikátor formátu potlačí veškeré výplně, které byly použity na výsledek. Jeho odstraněním je náš výsledek vycpaný. Obsahuje úvodní mezeru, protože to je místo, kde by se záporné znaménko přesunulo, pokud by číslo bylo záporné. A také obsahuje koncové nuly, protože jsme zadali dvě 9
prvky formátu.
Další nápady, jak formátovat čísla s desetinnými místy, najdete v části 3 způsoby formátování čísla na 2 desetinná místa v Oracle.
Odebrat všechna desetinná místa
Existuje několik způsobů, jak formátovat číslo tak, aby nemělo žádná desetinná místa. Jedním zřejmým způsobem je jednoduše odstranit desetinnou část z našeho formátovacího řetězce:
SELECT
TO_CHAR(7, 'fm9')
FROM DUAL;
Výsledek:
7
Můžeme ale použít i další funkce, jako je ROUND()
, TRUNC()
a CAST()
k dosažení stejného nebo podobného efektu.
Příklady viz 4 způsoby formátování čísla bez desetinných míst v Oracle.
Přidat úvodní nuly
Pokud jde o přidání úvodních nul k našemu číslu, máme několik možností.
Opět zůstaňme u TO_CHAR()
funkce, můžeme použít 0
formátovací prvek pro vrácení úvodní a koncové nuly.
SELECT
TO_CHAR(7, 'fm000')
FROM DUAL;
Výsledek:
007
Pokud bychom použili 9
format element, neměli bychom žádné úvodní nuly:
SELECT
TO_CHAR(7, 'fm999')
FROM DUAL;
Výsledek:
7
Pokud však odstraníme fm
modifikátor formátu, dostali bychom mezeru, kde by jakákoli úvodní nula byla:
SELECT
TO_CHAR(7, '999')
FROM DUAL;
Výsledek:
7
Dalším způsobem formátování čísla s úvodními nulami je LPAD()
funkce. Tato funkce aplikuje levou výplň na řetězec nebo číslo. Můžete určit, které znaky se mají použít pro výplň, takže pokud použijete nulu, bude doplněna nulami.
Příklad viz 2 způsoby formátování čísla s úvodními nulami v Oracle.
Jak zkontrolovat parametry NLS
Parametry NLS (National Language Support) určují chování specifické pro národní prostředí na klientovi i na serveru. To zahrnuje parametry, které určují, které znaky se mají použít pro oddělovač skupiny, desetinný znak, symboly měny atd.
Pojďme zkontrolovat aktuální hodnotu mých parametrů NLS:
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS;
Výsledek:
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
Následující parametry určují prvky formátování čísel a měn:
NLS_CURRENCY
NLS_ISO_CURRENCY
NLS_NUMERIC_CHARACTERS
NLS_DUAL_CURRENCY
Výchozí hodnota těchto parametrů je určena NLS_TERRITORY
parametr. Když nastavíme hodnotu NLS_TERRITORY
Tento parametr implicitně nastavuje hodnotu pro různé další parametry (včetně čtyř zmíněných).
V mém případě je mým územím Austrálie, a proto tyto čtyři parametry odrážejí, jak jsou čísla obvykle formátována v Austrálii. Pokud bych to změnil na Německo, pak by se tyto čtyři parametry aktualizovaly, aby odrážely formátování pro Německo.
Každý parametr však můžete explicitně nastavit samostatně. To vám umožní přepsat hodnotu, která byla implicitně nastavena pomocí NLS_TERRITORY
parametr.