Преобразовать число в строку oracle

Теперь давайте рассмотрим особенности работы с функцией TO_CHAR() применительно к преобразованию, чисел. При выполнении этой операции функция имеет следующий синтаксис:

При этом функция TO_CHAR() преобразует тип NUMBER в тип VARCHAR2. В таблице указано, какие есть форматы и как они используются при преобразовании:

Элемент формата Пример строки данного формата Описание
9 99 Каждая цифра 9 представляет значащую цифру результата. Число значащих цифр возвращаемого значения равно числу цифр 9, отрицательное значение предваряется знаком минуса. Все начальные нули заменяются пробелами.
0999 Возвращается число с начальными нулями, а не пробелами.
9990 Возвращается число с конечными нулями, а не пробелами.
$ $999 Возвращаемое значение предваряется знаком доллара не зависимо от используемого символа денежной единицы можно применить совместно с начальными или конечными нулями.
B B999 Вместо нулевой целой части десятичного число возвращаются пробелы.
MI 999MI Возвращает отрицательное число, у которого знак минуса указан не в начале, а в конце. В положительном значении на этом месте будет пробел.
S S9999 Возвращаемое число предваряется знаком: + для положительных, чисел — для отрицательных.
S 9999S Возвращаемое число заканчивается знаком: + для положительных, чисел — для отрицательных.
PR 99PR Возвращается отрицательное число в угловых скобках " ". У положительных чисел, на этом месте пробелы.
D 99D9 Возвращает число с десятичной точкой в указанной позиции. Число 9 с обеих сторон указывает максимальное число цифр.
G 9G999 Возвращает число с разделителем групп в указанной позиции. G может появляться в указанной строке формата неоднократно.
C C99 Возвращает число с символом денежной единицы ISO в указанной позиции. C может появляться в указанной строке формата неоднократно.
L L999 Возвращает число с символом денежной единицы национального языка в указанной позиции.
, 999,999 Возвращает число с запятой в указанной позиции, не зависимо от выбранного разделителя групп.
. 99.99 Возвращает число с десятичной точкой в указанной позиции, не зависимо от выбранного десятичного разделителя.
V 99V999 Возвращает число, умноженное на 10n, где n — это число цифр 9 после V. При необходимости значение округляется.
EEEE 9.99EEEE Возвращает число в экспоненциальном представлении.
RM RM Возвращает число при помощи римских цифр верхнего регистра.

Для примера, приведем вот такой блок:

После запуска получаем:

И для полноты картины, давайте рассмотрим функцию TO_NUMBER(), так как с TO_CHAR() они практически близнецы, но с двух противоположных сторон. Синтаксис у TO_NUMBER следующий:

В данном случае "строка_символов" — это тип CHAR или VARCHAR2, которая применительно к "формат", преобразуется в типу NUMBER. "формат" в данной функции, тот же что и для TO_CHAR(). Вот так достаточно просто. А, если в предыдущем примере поменять, например, третью снизу строку вот так:

То, достаточно хорошо видно, как все взаимосвязано для этих двух функций! Пробуйте. 🙂

нужна помощь в преобразовании чисел:

но как сделать мой вывод, как:

мне нужно 0 до запятой, но не после.

2 ответов

С помощью FM формат модели модификатор чтобы приблизиться, так как вы не получите конечные нули после десятичного разделителя; но вы все равно получите сам разделитель, например 50. . Вы можете использовать rtrim чтобы избавиться от этого:

Читайте также  Программы для низкоуровневого форматирования жестких дисков

обратите внимание, что я использую to_char(0, ‘D’) чтобы создать символ для обрезки, чтобы соответствовать десятичному разделителю-поэтому он ищет тот же символ, , или . , как первый to_char добавляет.

небольшое недостатком является то, что вы теряете выравнивания. Если это используется в другом месте, это может не иметь значения, но это так, вы также можете обернуть его в lpad , который начинает делать его немного сложным:

Компьютеры лучше работают с числами в двоичном представлении, тогда как людям удобнее видеть числовые данные в виде строк, состоящих из цифр, запятых и пробелов. PL/SQL позволяет преобразовывать числа в строки, и наоборот. Обычно такие преобразования выполняются функциями TO_CHAR и TO_NUMBER .

При работе с двоичными вещественными типами IEEE-754 используйте функции TO_BINARY_FLOAT и TO_BINARY_DOUBLE . Чтобы упростить последующее изложение, в тексте будет упоминаться только функция TO_NUMBER . Помните, что все неуточненные ссылки на TO_NUMBER в равной степени относятся к функциям TO_BINARY_FLOAT и TO_BINARY_DOUBLE .

Функция TO_NUMBER

Функция TO_NUMBER преобразует строки фиксированной и переменной длины, а также вещественные типы IEEE-754 к типу NUMBER с использованием необязательной маски форматирования. Используйте эту функцию, когда потребуется преобразовать строковое представление числа в соответствующее числовое значение. Синтаксис вызова TO_NUMBER :

Здесь строка — строка или выражение типа BINARY_DOUBLE , содержащее представление числа; формат — необязательная маска, которая определяет, как функция TO_NUMBER должна интерпретировать символьное представление числа, содержащегося в первом параметре; параметры_nls — необязательная строка со значениями параметров NLS . Ее можно применять для замены текущих установок параметров NLS уровня сеанса.

При работе с функциями TO_BINARY_FLOAT и TO_BINARY_DOUBLE можно использовать строки INF и –INF для представления положительной и отрицательной бесконечности, а также строку NaN для представления «не числа». Эти специальные строки не чувствительны к регистру символов.

Использование TO_NUMBER без параметров форматирования

В простейших случаях функция TO_NUMBER вызывается без строки форматирования. Все следующие преобразования успешно выполняются без дополнительных параметров:

В общем случае функция TO_NUMBER может использоваться без параметров форматирования в следующих случаях:

  • когда число представлено только цифрами с единственной десятичной запятой;
  • при использовании научной записи — например, 1.25E2;
  • перед числом стоит необязательный знак, плюс или минус; при отсутствии знака число считается положительным.

Если символьная строка не соответствует этим критериям или значения должны округляться до заданного количества десятичных знаков, вызывайте функцию TO_NUMBER с маской форматирования.

Использование TO_NUMBER с маской форматирования

Применение функции TO_NUMBER с маской форматирования позволяет получить более разнообразные представления чисел в PL/SQL. Например, местоположение разделителей групп и символ денежной единицы могут задаваться следующим образом:

Указывать в форматной строке точное количество цифр не обязательно. Функция TO_NUMBER позволяет задать в строке форматирования больше цифр, чем содержится в преобразуемом значении. Следующая строка кода также выполняется без ошибок:

Но если справа или слева от десятичной запятой значение содержит больше цифр, чем допускает маска форматирования, произойдет ошибка. Первое из следующих двух преобразований завершится ошибкой, поскольку строка содержит десять цифр слева от десятичной запятой, тогда как маска разрешает только девять. Второе преобразование завершается ошибкой из-за того, что строка содержит слишком много цифр справа от десятичной запятой:

Читайте также  Сколько листов можно распечатать на одном картридже

Элемент форматирования 0 обеспечивает вывод начальных нулей:

Элемент PR распознает угловые скобки как обозначение отрицательного числа:

Однако не все элементы форматирования предназначены для преобразования строк в числа. Например, элемент RN , предназначенный для вывода числа римскими цифрами, предназначен только для форматирования выводимой информации. Следующая попытка преобразования вызовет ошибку:

Элемент EEEE тоже используется только для форматирования вывода. Для обратного преобразования он не нужен, поскольку функция TO_NUMBER правильно распознает числа в научной записи без дополнительных указаний:

Передача функции TO_NUMBER параметров NLS

Действие многих элементов форматирования определяется текущими установками параметров NLS . Например, элемент G представляет разделитель групп разрядов, но какой именно символ используется в качестве разделителя, зависит от текущего значения параметра NLS_NUMERIC_CHARACTERS в момент выполнения преобразования. Для просмотра текущих значений параметров можно запросить представление NLS_SESSION_PARAMETERS :

Некоторые установки NLS по умолчанию зависят от других. Если присвоить параметру NLS_TERRITORY значение AMERICA , Oracle по умолчанию установит параметр NLS_NUMERIC_CHARACTERS равным ‘.,’. Это не помешает явно присвоить параметру NLS_NUMERIC_CHARACTERS другое значение (например, с использованием команды ALTER SESSION ).

Иногда отдельные параметры NLS требуется переопределить только на время вызова TO_NUMBER . В этом случае нужные установки задаются в этом вызове и действуют они исключительно для него. Например, в следующем примере при вызове TO_NUMBER задаются установки NLS , соответствующие NLS_TERRITORY = FRANCE :

Строка параметров NLS получается слишком длинной, поэтому мы разбиваем ее на три строки, объединяемых оператором конкатенации, чтобы пример лучше смотрелся на странице. Обратите внимание на дублирование кавычек. Параметру NLS_NUMERIC_CHARACTERS требуется присвоить следующее значение:

Поскольку это значение вместе с кавычками включается в строку параметров NLS , каждую кавычку необходимо продублировать. В результате получается следующая строка:

Функция TO_NUMBER позволяет задавать только три приведенных в данном примере параметра NLS . Было бы удобнее, если бы при вызове можно было использовать следующую запись:

К сожалению, изменение параметра NLS_TERRITORY при вызове TO_NUMBER не поддерживается. Функция поддерживает только NLS_NUMERIC_CHARACTERS , NLS_CURRENCY и NLS_ISO_CURRENCY .

За подробной информацией о настройке параметров NLS обращайтесь к руководству «Oracle’s Globalization Support Guide», которое является частью документации Oracle11g.

Передавать TO_NUMBER третий аргумент не рекомендуется — лучше полагаться на настройки сеанса, определяющие, как PL/SQL интерпретирует элементы маски форматирования (такие, как L, G и D). Вместо того чтобы жестко кодировать информацию в программах, нужно дать пользователю возможность задавать их на уровне сеанса.

Функция TO_CHAR

Функция TO_CHAR выполняет задачу, обратную функции TO_NUMBER : она преобразует число в его символьное представление. Используя необязательную маску форматирования, можно подробно указать, каким должно быть представление. Функция TO_CHAR вызывается следующим образом:

Здесь число — это число, которое требуется представить в символьной форме. Оно может относиться к любому из числовых типов PL/SQL: NUMBER, PLS_INTEGER, BINARY_INTEGER, BINARY_FLOAT, BINARY_DOUBLE, SIMPLE_INTEGER, SIMPLE_FLOAT или SIMPLE_DOUBLE . Параметр формат содержит необязательную маску форматирования, определяющую способ представления числа в символьной форме; необязательная строка параметры_nls содержит значения параметров NLS . Ее можно применить для замещения текущих установок параметров NLS уровня сеанса.

Читайте также  Скарт что это такое

Если вы хотите, чтобы результат был представлен в национальном наборе символов, используйте вместо TO_CHAR функцию TO_NCHAR . При этом помните, что строка форматирования числа должна быть представлена символами национального набора; в противном случае полученная строка будет состоять из символов « # ».

Использование TO_CHAR без маски форматирования

Функция TO_CHAR , как и TO_NUMBER , может вызываться без маски форматирования:

Результат выглядит так:

В отличие от TO_NUMBER форма TO_CHAR особой пользы не приносит. Чтобы число лучше читалось, нужно задать как минимум разделитель групп разрядов.

Использование функции TO_CHAR с маской форматирования

При преобразовании числа в символьное представление функция TO_CHAR используется чаще всего с маской форматирования. Например, с ее помощью можно вывести денежную сумму:

В локальном контексте США результат будет выглядеть так:

Элементы форматирования позволяют очень гибко определять формат символьного представления числа. Чтобы лучше понять, как они работают, стоит немного с ними поэкспериментировать. В следующем примере указано, что старшие разряды должны быть заполнены нулями, но при этом элемент форматирования B требует замены нулей пробелами. Данный элемент предшествует цифровым элементам (нулям), но следует за индикатором вывода знака денежной единицы L :

Результат будет иметь следующий вид:

В примере выводится только одна строка, полученная после первого преобразования. В результате второго преобразования получается нуль, и элемент форматирования B заставляет TO_CHAR вернуть пустую строку, хотя в маске форматирования указано, что нулевые старшие разряды числа следует оставить. В качестве эксперимента попробуйте выполнить этот пример без элемента B.

Не все комбинации элементов форматирования являются допустимыми. Например, нельзя использовать сочетание LRN , которое выводит перед числом, записанным римскими цифрами, знак денежной единицы. Oracle не документирует такие нюансы, поэтому о некоторых из них можно узнать только на практике.

Элемент форматирования V

Элемент форматирования V достаточно необычен, чтобы его стоило упомянуть особо. Он позволяет масштабировать значение, а его действие лучше показать на примере (рис. 1).

Рис. 1. Элемент форматирования V

Зачем может понадобиться масштабирование? Рассмотрим простой пример. Стандартная единица сделки на бирже составляет 100 акций, и сообщая о реализованных на бирже акциях обычно говорят о количестве проданных пакетов по 100 акций. Поэтому 123 продажи означает 123 пакета по 100 акций, то есть 12 300 акций.

Следующий пример показывает, как использовать элемент V для масштабирования значения 123, с учетом того, что на самом деле оно представляет количество сотен:

Заметьте, что в этом примере маска форматирования включает элемент G , определяющий местоположение разделителя групп (запятой), который может быть задан только слева от элемента V , что не всегда удобно. Следующая маска форматирования на первый взгляд выглядит вполне разумно:

Вы ожидаете, что результат будет отформатирован в виде 1,234,500, но элемент G не может располагаться справа от V. Можно использовать маску 9G99V9999 для получения результата 1,234500 или маску 999V9999 для получения 1234500, но оба эти результата выглядят не так, как нам хотелось бы.

Едва ли вы часто будете пользоваться элементом V , но знать о нем нужно.

Ссылка на основную публикацию
Adblock
detector