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 — Få numerisk formateringsinformation
Beskrivelse
Returnerer et associativt array indeholdende lokaliserede numeriske og møntfods formateringsinformationer.
localeconv() returnerer data baseret på den nuværende locale som sat af setlocale(). Det associative array som bliver returneret indeholder følgende felter:
| Arrayelement | Beskrivelse |
|---|---|
| decimal_point | Decimaltegn |
| thousands_sep | Tusindeseperator |
| grouping | Array indeholdene numeriske grupperinger |
| int_curr_symbol | Internationalt valutasymbol (eks. USD) |
| currency_symbol | Lokalt valutasymbol (eks. $) |
| mon_decimal_point | Møntfods decimaltegn |
| mon_thousands_sep | Møntfods tusindeseperator |
| mon_grouping | Array indeholdende møntfodsgrupperinger |
| positive_sign | Tegn for positive værdier |
| negative_sign | Tegn for negative værdier |
| int_frac_digits | Internationale brøkcifre |
| frac_digits | Lokale brøkcifre |
| p_cs_precedes | TRUE hvis currency_symbol starter med en positiv værdi, FALSE hvis den følger efter en |
| p_sep_by_space | TRUE hvis et mellemrum sepererer currency_symbol fra en positiv værdi, FALSE ellers |
| n_cs_precedes | TRUE hvis currency_symbol starter med en negativ værdi, FALSE hvis den følger efter en |
| n_sep_by_space | TRUE hvis et mellemrum sepererer currency_symbol fra en negativ værdi, FALSE ellers |
| p_sign_posn |
|
| n_sign_posn |
|
n_sign_pos og n_sign_posn indeholder en streng med formateringsinformationer. Hver nummer repræsenterer en af de ovenstående muligheder.
Grupperingsfelterne indeholder arrays som definerer måden numre skal grupperes. For eksempel, grupperingsfeltet for en_US localen, ville indeholde et 2-elementers array med værdierne 3 og 3. Jo højere indeks i arrayet, jo længere mod venstre er grupperingen. Hvis et arrayelement er lig med CHAR_MAX, bliver der ikke udført flere grupperinger. Hvis et arrayelement er lig med 0, vil det forrige element blive brugt.
Example#1 localeconv() eksempel
<?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 ) )
Se også setlocale().
localeconv
24-Nov-2007 09:15
23-Jul-2001 02: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])...
