В Oracle Database можете да форматирате числа по много начини.
Например, можете да форматирате число като валута със запетаи и десетични точки на правилното място. Можете да посочите водещи нули, можете да добавите дробна част – или да я премахнете, ако това е необходимо.
Тази статия съдържа примери за следното:
- Форматирайте числата като валута
- Добавете разделител запетая/хиляди
- Включете десетични знаци
- Премахнете всички десетични знаци
- Добавете водещи нули към число
Обяснявам също как форматирането се влияе от NLS параметрите на вашата сесия.
Параметрите за инициализация на NLS определят кои знаци се използват за разделителя на групата, десетичния знак и символа за валута в текущата сесия. Можете да се възползвате от тези параметри, за да изведете форматиране, съобразено с локал.
Можете да използвате функции като TO_CHAR(number)
и дори LPAD()
за да конвертирате числа в низ и да ги форматирате точно както желаете в движение. Функции като CAST()
може също да има ефект върху това как се форматира числото в зависимост от типа данни, към който се предава.
Бърз пример
Ето бърз пример за форматиране на число с помощта на TO_CHAR()
функция:
SELECT
TO_CHAR(12345, 'fmL99G999D00')
FROM DUAL;
Резултат:
$12,345.00
fmL99G999D00
part е форматен модел, който определя как да се форматира изходът. Можете да промените модела на формата, за да отговаря на вашите изисквания.
Всеки знак във форматния модел е форматен елемент и има специално значение. Можете да добавяте или премахвате елементи за формат, както е необходимо.
Ето пълен списък с елементи на формат, които можете да използвате за вашия модел на формат, когато форматирате числа.
Въпреки че е вярно, че можете да предоставите низов литерал за различни елементи на формат (например знак за долар ($
) за долари), това предполага, че валутата е деноминирана в тази твърдо кодирана стойност. Има много други възможни валути по целия свят, а елементите на формата са в състояние да връщат динамично символа на местната валута за сесията на потребителя.
Същото е и за разделителя на групата и десетичния знак. Различните локали използват различни конвенции. Използването на тези елементи за форматиране, които разбират локал, прави кода ви по-преносим.
Също така, TO_CHAR()
функцията ви позволява да предавате вашите собствени NLS параметри в рамките на функцията. Това засяга само това извикване на функция, така че можете да променяте неща като валутни символи в движение, без да е необходимо да ги кодирате твърдо във вашия модел на формат или да актуализирате NLS параметрите за вашата сесия.
Следващите примери показват по-подробно как работи всеки елемент на формат.
Форматиране на числата като валута
Ето пример за форматиране на число като валута:
SELECT
TO_CHAR(12, 'fmL99')
FROM DUAL;
Резултат:
$12
В този случай използвах L
елемент формат, за да посочите символа за местна валута. Символът на местната валута се определя от NLS_CURRENCY
параметър.
Като алтернатива можете да използвате C
или U
форматни елементи, които връщат съответно символа за валута ISO и символа за двойна валута.
Вижте Как да форматирате числата като валута в Oracle за повече информация и примери.
Добавете разделител запетая/хиляди
Въпреки че винаги можете да използвате твърдо кодирана запетая за вашия разделител на хиляди/групи, това не взема предвид държавите, които използват точка за своя разделител на групи. Обратното очевидно е вярно. Освен това някои държави разделят хиляди групи с тънко пространство.
Можете да използвате G
елемент формат, за да посочите разделител на група. Това динамично връща приложимия разделител на групи, както е посочено в NLS_NUMERIC_CHARACTERS
параметър. Този параметър определя както разделителя на групата, така и десетичния знак.
Пример:
SELECT
TO_CHAR(12345, 'fm99G999')
FROM DUAL;
Резултат:
12,345
Ето още един пример с по-голямо число:
SELECT
TO_CHAR(123456789, 'fm999G999G999')
FROM DUAL;
Резултат:
123,456,789
Вижте Как да форматирате число със запетая в Oracle за по-подробна дискусия.
Включете десетични знаци
Въпреки че е вярно, че можете да кодирате твърдо своя собствен основен знак (например точка) във вашия модел на формат, това няма да се погрижи за други локали, които използват различен знак.
Можете да използвате D
форматен елемент, за да върне десетичния/основния знак, който е посочен в NLS_NUMERIC_CHARACTERS
параметър за текущата сесия:
SELECT
TO_CHAR(7, 'fm9D00')
FROM DUAL;
Резултат:
7.00
В този случай използвах две 0
форматни елементи след знака за основа. Този елемент на формат връща крайни нули, където е приложимо.
Използване на 9
ще потисне всички последващи нули в този случай:
SELECT
TO_CHAR(7, 'fm9D99')
FROM DUAL;
Резултат:
7.
Ако обаче премахнем fm
модификатор на формат, получаваме различен резултат:
SELECT
TO_CHAR(7, '9D99')
FROM DUAL;
Резултат:
7.00
fm
модификаторът на формат потиска всяко допълване, което е приложено към резултата. Като го премахнем, нашият резултат е подплатен. Той съдържа водещо пространство, защото тук би отишъл отрицателен знак, ако числото беше отрицателно. И също така съдържа крайни нули, защото посочихме две 9
форматни елементи.
Вижте 3 начина за форматиране на число до 2 десетични знака в Oracle за повече идеи как да форматирате числа с десетични знака.
Премахване на всички десетични знаци
Има няколко начина да форматирате число, така че да няма десетични знаци. Един очевиден начин е просто да премахнете десетичната част от нашия форматен низ:
SELECT
TO_CHAR(7, 'fm9')
FROM DUAL;
Резултат:
7
Но можем да използваме и други функции, като ROUND()
, TRUNC()
и CAST()
за постигане на същия или подобен ефект.
Вижте 4 начина за форматиране на число без десетични знаци в Oracle за примери.
Добавяне на водещи нули
Имаме няколко опции, когато става въпрос за добавяне на водещи нули към нашето число.
Отново се придържаме към TO_CHAR()
функция, можем да използваме 0
формат елемент за връщане на начални и крайни нули.
SELECT
TO_CHAR(7, 'fm000')
FROM DUAL;
Резултат:
007
Ако използвахме 9
форматен елемент, нямаше да имаме водещи нули:
SELECT
TO_CHAR(7, 'fm999')
FROM DUAL;
Резултат:
7
Ако обаче премахнем fm
формат модификатор, щяхме да получим интервал, където всяка водеща нула би била:
SELECT
TO_CHAR(7, '999')
FROM DUAL;
Резултат:
7
Друг начин за форматиране на число с водещи нули е с LPAD()
функция. Тази функция прилага лявото допълване към низ или число. Можете да зададете кой знак/и да използвате за подпълване и така, ако използвате нула, тогава тя ще бъде допълнена с нули.
Вижте 2 начина за форматиране на число с водещи нули в Oracle за пример.
Как да проверите параметрите на NLS
Параметрите NLS (Поддръжка на националния език) определят специфичното за локала поведение както на клиента, така и на сървъра. Това включва параметри, които определят кои знаци да се използват за разделителя на групата, десетичния знак, символите за валута и т.н.
Нека проверим текущата стойност на моите NLS параметри:
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS;
Резултат:
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
Следните параметри определят елементите за форматиране за числа и валути:
NLS_CURRENCY
NLS_ISO_CURRENCY
NLS_NUMERIC_CHARACTERS
NLS_DUAL_CURRENCY
Стойността по подразбиране на тези параметри се определя от NLS_TERRITORY
параметър. Когато зададем стойността на NLS_TERRITORY
параметър, това имплицитно задава стойността за различни други параметри (включително четирите споменати).
В моя случай моята територия е Австралия и така тези четири параметъра отразяват как обикновено се форматират числата в Австралия. Ако го променя, за да кажа Германия, тогава тези четири параметъра ще бъдат актуализирани, за да отразяват форматирането за Германия.
Можете обаче изрично да зададете всеки параметър поотделно. Това ви позволява да замените стойността, която е имплицитно зададена от NLS_TERRITORY
параметър.