A function to get the right money & number formats:
<?php
function displayLocales($number, $isMoney, $lg='en_US.utf8') {
$ret = setLocale(LC_ALL, $lg);
setLocale(LC_TIME, 'Europe/Paris');
if ($ret===FALSE) {
echo "Language '$lg' is not supported by this system.\n";
return;
}
$LocaleConfig = localeConv();
forEach($LocaleConfig as $key => $val) $$key = $val;
// Sign specifications:
if ($number>0) {
$sign = $positive_sign;
$sign_posn = $p_sign_posn;
$sep_by_space = $p_sep_by_space;
$cs_precedes = $p_cs_precedes;
} else {
$sign = $negative_sign;
$sign_posn = $n_sign_posn;
$sep_by_space = $n_sep_by_space;
$cs_precedes = $n_cs_precedes;
}
// Number format:
$n = number_format(abs($number), $frac_digits,
$decimal_point, $thousands_sep);
$n = str_replace(' ', ' ', $n);
switch($sign_posn) {
case 0: $n = "($n)"; break;
case 1: $n = "$sign$n"; break;
case 2: $n = "$n$sign"; break;
case 3: $n = "$sign$n"; break;
case 4: $n = "$n$sign"; break;
default: $n = "$n [error sign_posn=$sign_posn !]";
}
// Currency format:
$m = number_format(abs($number), $frac_digits,
$mon_decimal_point, $mon_thousands_sep);
if ($sep_by_space) $space = ' '; else $space = '';
if ($cs_precedes) $m = "$currency_symbol$space$m";
else $m = "$m$space$currency_symbol";
$m = str_replace(' ', ' ', $m);
switch($sign_posn) {
case 0: $m = "($m)"; break;
case 1: $m = "$sign$m"; break;
case 2: $m = "$m$sign"; break;
case 3: $m = "$sign$m"; break;
case 4: $m = "$m$sign"; break;
default: $m = "$m [error sign_posn=$sign_posn !]";
}
if ($isMoney) return $m; else return $n;
}
$number = -12345.12345;
echo '<div>'.displayLocales($number, FALSE)."</div>\n";
echo '<div>'.displayLocales($number, TRUE)."</div>\n";
?>
localeconv
(PHP 4 >= 4.0.5, PHP 5)
localeconv — Връща информация за формата на числата
Описание
Връща асоциативен масив, съдържащ информация за числовите и парични формат за текущия локал.
Връщани стойности
localeconv() връща данни, на базата на текущия локал, установени от функция setlocale(). Асоциативният масив, който се връща, съдържа следните елементи:
| Елемент на масива | Описание |
|---|---|
| decimal_point | Знак за десетична запетая |
| thousands_sep | Разделител за хиляди |
| grouping | Масив съдържащ групирания на цифри |
| int_curr_symbol | Международно обозначение на валута (например USD) |
| currency_symbol | Национално обозначение на валута (например $) |
| mon_decimal_point | Знак за десетична точка в паричен формат |
| mon_thousands_sep | Разделител на групи в паричен формат |
| mon_grouping | Масив, съдържащ количеството цифри в групи в паричен формат |
| positive_sign | Знак за положителни стойности |
| negative_sign | Знак за отрицателни стойности |
| int_frac_digits | Брой на разрядите след десетичната запетая (международно) |
| frac_digits | Брой на разрядите след десетичната запетая (национално) |
| p_cs_precedes | Връща TRUE ако currency_symbol се записва преди положителна стойност, иначе връща FALSE if it succeeds one |
| p_sep_by_space | Връща TRUE ако currency_symbol е отделено от положителна стойност с интервал, иначе връща FALSE |
| n_cs_precedes | Връща TRUE ако currency_symbol се записва преди отрицателната стойност, иначе връща FALSE |
| n_sep_by_space | Връща TRUE ако currency_symbol е отделено от отрицателна стойност с интервал, иначе връща FALSE |
| p_sign_posn |
|
| n_sign_posn |
|
Елементите p_sign_posn и n_sign_posn съдържат низа на опциите за форматиране. Всяко число отговаря на съответното условие, посочено по-горе.
Полетата за групиране съдържат масиви, които определят начина, по който се групират числата. Например, полето за групиране в паричен формат за локал nl_NL (в UTF-8 кодиране и знак за евро) би съдържало масив от 2 елемента със стойности 3 и 3. Ако елементът на масива е равен на CHAR_MAX, групирането спира. Ако елементът на масива е равен на 0, ще бъде използван предишния елемент.
Примери
Example #1 Пример за localeconv()
<?php
if (false !== setlocale(LC_ALL, 'nl_NL.UTF-8@euro')) {
$locale_info = localeconv();
print_r($locale_info);
}
?>
Примерът по-горе ще изведе:
Array ( [decimal_point] => . [thousands_sep] => [int_curr_symbol] => EUR [currency_symbol] => € [mon_decimal_point] => , [mon_thousands_sep] => [positive_sign] => [negative_sign] => - [int_frac_digits] => 2 [frac_digits] => 2 [p_cs_precedes] => 1 [p_sep_by_space] => 1 [n_cs_precedes] => 1 [n_sep_by_space] => 1 [p_sign_posn] => 1 [n_sign_posn] => 2 [grouping] => Array ( ) [mon_grouping] => Array ( [0] => 3 [1] => 3 ) )
localeconv
24-Nov-2007 10:15
23-Jul-2001 04:13
The C99 standard modified slightly the definition of the international currency symbol, which is now 4 characters long instead of 3 in previous definitions. The fourth character will most often be an ASCII space, but its effective value is the locale-specific spacing character used for numeric grouping (i.e. the one refered by [sep_by_space] and [grouping])...
