Обсуждение глобализации и локализации не было бы полным без упоминания проблем, связанных с конвертацией валют. Самый распространенный способ перевода, скажем, долларов в иены, основан на использовании таблицы курсов. Но откуда приложение узнает, как должны отображаться полученные числа?
- Могут ли в них присутствовать точки и запятые и где они должны располагаться?
- Каким символом должна обозначаться каждая валюта (
$
для доллара,€
для евро и т. д.)? - Какое обозначение
ISO
следует использовать (USD
, например)?
Каждое печатное издание в схеме g11n
имеет цену и связывается с локальным контекстом. Для форматирования строк можно воспользоваться функцией TO_CHAR
, но как насчет правильного отображения цены? Можно воспользоваться параметром NLS_CURRENCY
:
FUNCTION currency_conv_func
RETURN sys_refcursor
IS
v_currency sys_refcursor;
BEGIN
OPEN v_currency
FOR
SELECT pub.title "Title",
TO_CHAR (pub.price,
locale.currency_format,
'NLS_CURRENCY=' || locale.currency_symbol
) "Price"
FROM publication pub, locale
WHERE pub.locale_id = locale.locale_id;
RETURN v_currency;
END currency_conv_func;
При выполнении функции преобразования:
VARIABLE v_currency REFCURSOR
CALL currency_conv_func() INTO :v_currency;
PRINT v_currency
выводится следующий список цен:
Title Price
---------------------------------- ----------------
Oracle PL/SQL Programming, 3rd Edition $54.95
Oracle PL/SQLプログラミング 基礎編 第3版 ¥5,800
Oracle PL/SQL Programmierung, 2. Auflage €64
Обратите внимание: собственно преобразование в этом примере не выполняется. Если вам понадобится автоматизировать преобразование денежных сумм из одной валюты в другую, определите таблицу курсов и правила преобразования.
Обозначение NLS_ISO_CURRENCY
обычно представляет собой сокращенное название валюты из трех символов. Если не считать немногочисленных исключений, первые два символа определяют страну или локальный контекст, а третий символ — собственно валюту. Например, американский доллар и японская иена обозначаются соответственно USD
и JPY
. Впрочем, евро сейчас используется во многих европейских странах, так что это правило уже не работает — обозначение EUR
используется независимо от страны.
В схему g11n
включены данные, которые упрощают вывод цен печатных изданий с правильными сокращениями ISO
. Пример такого рода встречается в функции IS0_
currency_func
:
FUNCTION iso_currency_func
RETURN sys_refcursor
IS
v_currency sys_refcursor;
BEGIN
OPEN v_currency
FOR
SELECT title "Title",
TO_CHAR (pub.price,
locale.iso_currency_format,
'NLS_ISO_CURRENCY=' || locale.iso_currency_name
) "Price - ISO Format"
FROM publication pub, locale
WHERE pub.locale_id = locale.locale_id
ORDER BY publication_id;
RETURN v_currency;
END iso_currency_func;
Выполнение функции iso_currency_func
:
VARIABLE v_currency REFCURSOR
CALL iso_currency_func() INTO :v_currency;
PRINT v_currency
Результат:
Title Price - ISO Format
-------------------------------------- ------------------
Oracle PL/SQL Programming, 3rd Edition USD54.95
Oracle PL/SQLプログラミング 基礎編 第3版 JPY5,800
Oracle PL/SQL Programmierung, 2. Auflage EUR64
Обозначения USD
, JPY
и EUR
включаются в выводимые цены, как и положено в соответствии с маской формата.