Локализация денежных значений

Задача
Необходимо показать денежную сумму в формате, соответствующем локали.

Решение
Для получения соответствующим образом отформатированной строки предназначена функция pc_format_currency(), показанная в примере 16.1. Например:

setlocale(LC_ALL,'fr_CA');
print pc_format_currency(-12345678.45);
(12 345 678,45 $)

Обсуждение
Функция pc_format_currency(), показанная в примере 16.1, получает информацию о форматировании значений валюты от функции localeconv(), а затем строит корректную строку с помощью функции number_format() и некоторой логики.

Пример 16.1. pc_format_currency
function pc_format_currency($amt) {
// получаем информацию форматирования значений валюты,
// соответствующую локали
$a = localeconv();
// вычисляем знак переменной $amt, а затем удаляем ее
if ($amt < 0) { $sign = -1; } else { $sign = 1; }
$amt = abs($amt);
// форматируем переменную $amt с соответствующей группировкой,
// десятичной точкой и дробными значениями
$amt = number_format($amt,$a['frac_digits'],$a['mon_decimal_point'],
$a['mon_thousands_sep']);// определяем местоположение символа валюты
// и положительного или отрицательного знаков
$currency_symbol = $a['currency_symbol'];
// is $amt >= 0 ?
if (1 == $sign) {
$sign_symbol = 'positive_sign';
$cs_precedes = 'p_cs_precedes';
$sign_posn = 'p_sign_posn';
$sep_by_space = 'p_sep_by_space';
} else {
$sign_symbol = 'negative_sign';
$cs_precedes = 'n_cs_precedes';
$sign_posn = 'n_sign_posn';
$sep_by_space = 'n_sep_by_space';
}
if ($a[$cs_precedes]) {
if (3 == $a[$sign_posn]) {
$currency_symbol = $a[$sign_symbol].$currency_symbol;
} elseif (4 == $a[$sign_posn]) {
$currency_symbol .= $a[$sign_symbol];
}
// символ валюты в начале
if ($a[$sep_by_space]) {
$amt = $currency_symbol.' '.$amt;
} else {
$amt = $currency_symbol.$amt;
}
} else {
// символ валюты после суммы
if ($a[$sep_by_space]) {
$amt .= ' '.$currency_symbol;
} else {
$amt .= $currency_symbol;
}
}
if (0 == $a[$sign_posn]) {
$amt = "($amt)";
} elseif (1 == $a[$sign_posn]) {
$amt = $a[$sign_symbol].$amt;
} elseif (2 == $a[$sign_posn]) {
$amt .= $a[$sign_symbol];
}
return $amt;

Код в функции pc_format_currency(), который ставит символ валюты и знак на правильное место, почти одинаков для положительных и отрицательных сумм; он лишь использует различные элементы массива, возвращенного функцией localeconv().


Соответствующие элементы массива, возвращаемого функцией localeconv().

В C-библиотеке есть функция с именем strfmon(), которая делает для валюты то же самое, что функция strftime() делает для дат и времени, однако в PHP она не реализована. Наша функция pc_format_currency() предоставляет большинство из этих возможностей..



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Использование определенной локали
Локализация включаемых файлов
Локализация дат и времени
Локализация изображений
Локализация текстовых сообщений