TO_CHAR - форматирование числа

Для преобразования числа в строку с заданным форматом используют функцию TO_CHAR:

to_char (число, формат)

Например:

SELECT to_char (12345, '99999990.00') AS "99999990.00",
       to_char (12345, 'S99999990.00') AS "S99999990.00",
       to_char (-12345, 'S99999990.00') AS "S99999990.00",
       to_char (12345, 'S99G999G990D00') AS "S99G999G990D00"
# 99999990.00 S99999990.00 S99999990.00 S99G999G990D00
1 12345.00 +12345.00 -12345.00 +12,345.00

Формат числа задается кодами форматирования

Код Описание
9 позиция цифры (может отсутствовать, если цифра незначащая)
0 позиция цифры (присутствует всегда, даже если цифра незначащая)
. (точка) десятичная точка
, (запятая) разделитель групп (тысяч)
PR отрицательное значение в угловых скобках
S знак, добавляемый к числу (с учётом локали)
L символ денежной единицы (с учётом локали)
D разделитель целой и дробной части числа (с учётом локали)
G разделитель групп (с учётом локали)
MI знак минус в заданной позиции (если число < 0)
PL знак плюс в заданной позиции (если число > 0)
SG знак плюс или минус в заданной позиции
RN число римскими цифрами (в диапазоне от 1 до 3999)
TH или th окончание порядкового числительного
V сдвиг на заданное количество цифр (см. замечания)
EEEE экспоненциальная запись числа

Из этого многообразия обычно используют только

Код Описание
9 позиция цифры (может отсутствовать, если цифра незначащая)
0 позиция цифры (присутствует всегда, даже если цифра незначащая)
D разделитель целой и дробной части числа (с учётом локали)
G разделитель групп (с учётом локали)

Пройдемся по ним.

9 - позиция цифры. Может отсутствовать, если цифра незначащая.

Если на позиции 9-ки в числе есть значащая цифра, то она отображается, если нет, то не отображается.

На примерах будет понятнее.

SELECT to_char (12, '999')
# to_char
1 12

Если дробную часть не указали в формате, то она не отображается:

SELECT to_char (12.345, '999')
# to_char
1 12

Дробная часть в формате начинается после точки . или символа D:

SELECT to_char (12.345, '999.9')
# to_char
1 12.3

Мы указали одну 9-ку после запятой, поэтому в отформатированном числе видем после запятой только десятки.

SELECT to_char (0.12345, '999.99')
# to_char
1 .12

Интересный момент: при форматировании числа цифры, выходящие за формат, не отбрасываются. Число сначала округляется до указанной в формате точности:

SELECT to_char (12.457, '999.99')
# to_char
1 12.46

Можно было ожидать, что в результате получим 12.45. Но так как на позиции тысячных стоит 7, то после округления получаем 12.46

0 - позиция цифры. Отображается всегда.

Если в формате числа встретился 0, то цифра всегда отображается:

SELECT to_char (12, '00') AS "00", 
       to_char (12, '000000') AS "000000"
# 00 000000
1 12 000012
SELECT to_char (0.12345, '999.99') as "999.99",
       to_char (0.12345, '990.99') as "990.99"
# 999.99 990.99
1 .12 0.12

D - разделитель целой и дробной части

Разделитель целой и дробной части нужен для указания, сколько знаков после запятой нужно отобразить:

SELECT to_char (123.4567, '999D0') AS "999D0", 
       to_char (123.4567, '999D00') AS "999D00"
# 999D0 999D00
1 123.5 123.46

G - разделитель групп

На месте G в формате числа вставляется символ разделителя групп. Обычно его используют для отделения тысяч, миллионов, миллиардов...

SELECT to_char (1234567.89, '9G999G999D00')
# to_char
1 1,234,567.89

Но ни что не мешает использовать его в произвольном месте:

SELECT to_char (12345, '999G9G9')
# to_char
1 123,4,5

Если число не входит в формат

Если в формате числа указать мешьше цифр, чем значащих цифр в самом числе, то в результате получим строку из # по формату:

SELECT to_char (123, '9D99'),
       to_char (123, '90')
# to_char to_char
1 #.## ##

8.12 ABS - модуль числа

9.1 Подзапрос во фразе FROM