Когато използвате TO_CHAR()
функция за форматиране на число в Oracle, използвате модел на форматиране, за да определите как трябва да бъде форматирано числото.
Например, можете да форматирате число като 12,345.00
или като 12.345,00
, в зависимост от вашия локал.
Форматният модел може да включва G
или D
форматни елементи, за да добавите запетая към число. Кой от тях ще използвате зависи от това дали искате запетаята като разделител на хиляди, или като десетичен знак.
Като алтернатива можете да използвате действителен знак запетая (,
) ако предпочитате, въпреки че този метод не е наясно с локал като G
и D
форматните елементи са.
G
и D
Елементи на формат
Ето пример за демонстрация на G
и D
форматни елементи:
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Резултат:
12,345.00
В този случай разделителят на групата извежда запетая, а десетичният знак извежда точка. Това е така, защото моята текуща сесия е NLS_TERRITORY
параметърът е настроен на Australia
.
Ето какво се случва, ако променя моята NLS_TERRITORY
параметър към Germany
:
ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Резултат:
12,345.00
Сега запетаята се използва за десетичния знак.
Като бързо обяснение на горния форматен модел:
fm
модификаторът на формат потиска всяко подпълване, което може да бъде приложено към резултата.9
символите представляват числа.0
символът представлява числа, без да се потискат водещи или крайни нули.
Ето пълен списък с елементи на числовия формат, които можете да използвате като бърза справка.
Tтой NLS_NUMERIC_CHARACTERS
Параметър
Когато зададем NLS_TERRITORY
параметър (както в предишния пример), това имплицитно задава куп други параметри, включително NLS_NUMERIC_CHARACTERS
параметър.
Tтой NLS_NUMERIC_CHARACTERS
параметърът определя кои знаци се използват за разделителя на групата и десетичния знак.
Можем да направим заявка за V$NLS_PARAMETERS
преглед, за да видите кои знаци се използват за разделителя на групата и десетичния знак:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_NUMERIC_CHARACTERS';
Резултат:
,.
Тук виждаме, че десетичният знак е представен със запетая, а разделителят на групата е представен с точка.
Можете да промените стойността на NLS_NUMERIC_CHARACTERS
параметър директно, ако желаете (т.е. без да променяте NLS_TERRITORY
параметър).
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Резултат:
12,345.00
Но вероятно трябва да избягвате да правите това, защото това води до прекъсване на връзката между NLS параметрите. Вашите NLS параметри вече не отразяват стойностите по подразбиране за текущата територия. Освен ако нямате основателна причина да не го правите, обикновено е по-добре да промените NLS_TERRITORY
параметър към съответната територия, така че други параметри също могат да бъдат актуализирани до техните по подразбиране за новата територия.
'nlsparam'
Аргумент
Едно нещо, което трябва да спомена е, че T0_CHAR()
функцията приема трети аргумент, който ви позволява временно да задавате различни NLS параметри, включително NLS_NUMERIC_CHARACTERS
параметър. Когато направите това на ниво функция, това не променя стойността на тези параметри за текущата сесия.
Ето един пример:
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;
Резултат:
r1 r2 r3 ____________ ____________ ____________ 12.345,00 12,345.00 12.345,00
Тук зададох територията на сесията на Германия и след това извиках TO_CHAR()
три пъти.
- Първото обаждане използва NLS параметрите на сесията. Това означава, че разделителят на групата по подразбиране е точка.
- При второто обаждане изрично зададох свои собствени
NLS_NUMERIC_CHARACTERS
параметър от функцията. В този случай зададох разделителя на групата да бъде запетая. Това не повлия на NLS параметрите на моята сесия, както се вижда от третото извикване. - Третото обаждане използва NLS параметрите на сесията, точно както първото. Както виждаме, разделителят на групата и десетичният знак не са били засегнати от (временната) промяна, която направихме при второто ни обаждане.
Твърдо кодирана запетая
Друг начин да добавите запетая към число е да го кодирате твърдо във вашия модел на формат.
Пример:
ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99,999.00')
FROM DUAL;
Резултат:
12,345.00
В този случай твърдо кодирах запетаята и точката. Правейки това игнорира разделителя на групата, зададен в NLS_NUMERIC_CHARACTERS
параметър.
Множество запетаи
Можете да имате множество запетаи и/или разделители на групи в рамките на модел на формат.
Пример:
ALTER SESSION SET NLS_TERRITORY = 'Australia';
SELECT TO_CHAR(123456789, 'fm999G999G999D00')
FROM DUAL;
Резултат:
123,456,789.00
Невалидно разположение на запетая
Запетая или разделител на група не може да се появи отдясно на десетичен знак или точка в модел с числов формат.
SELECT TO_CHAR(12345, 'fm99D999G00')
FROM DUAL;
Резултат:
Error report - ORA-01481: invalid number format model