Аргерих Л. О языке РНР. Часть 5. Страница 53


function localef({amount) {

// Экспорт значений, возвращаемых localeconv, в локальную область видимости extract(localeconv());

Сначала число форматируется с помощью number_format(). Эта функция ис­пользует абсолютное значение $amount, поэтому мы убираем знак минус. Не­обходимо обеспечить абсолютное значение $amount, потому что локаль может определять свои знаки вместо обычных плюса (+) и минуса (-). Эта функция устанавливает в $sign правильный знак:

Сначала форматируется число без знака {number = number_format(abs($amount), $frac_digits, {mon_decimal_point, {mon_thousands_sep);

Функция localef также строит ключ, с помощью которого можно будет по­том найти нужный формат в массиве. Ключ строится путем конкатенации различных переменных, используемых для выбора формата строки. Этот прием делает код более компактным, чем в случае применения операторов if и case. Таким образом, каждый символ ключа соответствует различному выбору.

Если первый символ 1, значит, имеет истинное значение,

т. е. символ денежной единицы должен предшествовать числу. Поэтому мы видим, что $currency_symbol предшествует %s во всех строках формата, ключ которых начинается с 1. Спецификатор %s будет заменен фактическим чис­лом, когда далее строка формата будет применена:

if (Samountc 0) {

Ssign = $negative_sign;

/* Следующие команды преобразуют булево значение в целое число */ Sn_cs„precedes = intval($n_cs_precedes == true); $n_sep_by_space = intval ($n_sep_by_space == true); Skey = $n_cs_precedes . $n_sep_by_space . $n_sign_posn; } else {

Ssign = $positive_sign;

$p_cs_precedes = intval($p_cs_precedes — true);

Sp_sep_by_space = intval($p_sep_by_space == true); $key = $p cs precedes . $p sep_by_space . $p_sign_posn;

}

$formats = array(

// Символ денежной единицы после суммы // Без пробела между суммой и знаком. 'ООО' => '(%s' . Scurrency_symbol . ')', '001' => Ssign . '%s ' . Scurrency„symbol, '002' => '%s' . $currency_symbol . $sign, '003' => '%s' - Ssign . $currency_symbol, '004' => ■«$' . Ssign . $currency_symbol,

// Один пробел между количеством и знаком. '010 => '(Us1 . Scurrency_symbol . ')', '011' => $sign . '%s ' . Scurrency^symbol, '012' => '%s ' . Scurrency_sytnbol . Ssign, '013' => '%s ' . Ssign . Scurrency_symbol, '014 => '%s ' . Ssign . $currency_symbol,

// Символ денежной единицы перед суммой // Без пробела между суммой и знаком. '100' => '(' . $currency_syinbol . '%s)'r '101' => Ssign . Scurrency.symbol . '%s', '102' => $currency_symbol . '%s' . Ssign, '103' => Ssign . $currency_symbol . ' %s', '104' => $currency_symbol . Ssign . '%s',