(PHP 4 >= 4.0.5, PHP 5)
localeconv — Ermittelt die Formatierungsinformationen für Zahlen
Gibt ein assoziatives Array zurück, das die lokalisierten Informationen zur Formatierung von Zahlen und Geldbeträgen enthält.
localeconv() gibt Daten basierend auf den aktuellen Locale-Einstellungen, wie sie mittels setlocale() festgelegt werden können, zurück. Das assoziative Array, das zurückgegeben wird, enthält folgende Felder:
Arrayelement | Beschreibung |
---|---|
decimal_point | Dezimaltrennzeichen |
thousands_sep | Tausendertrennzeichen |
grouping | Array mit numerischen Gruppierungen |
int_curr_symbol | Internationales Währungssymbol (i.e. USD) |
currency_symbol | Lokales Währungssymbol (i.e. $) |
mon_decimal_point | Dezimaltrennzeichen bei Geldbeträgen |
mon_thousands_sep | Tausendertrennzeichen bei Geldbeträgen |
mon_grouping | Array mit Geldbetragsgruppierungen |
positive_sign | Vorzeichen für positive Werte |
negative_sign | Vorzeichen für negative WerteS |
int_frac_digits | Internationale Dezimalbrüche |
frac_digits | Lokale Dezimalbrüche |
p_cs_precedes | Ist TRUE, wenn das Währungssymbol einem positiver Wert voransteht, oder FALSE, wenn es einem positiven Wert folgt. |
p_sep_by_space | Ist TRUE, wenn ein Leerzeichen das Währungssymbol von einem positiven Wert trennt, ansonsten FALSE. |
n_cs_precedes | Ist TRUE, wenn das Währungssymbol einem negativer Wert voransteht, oder FALSE, wenn es einem negativen Wert folgt. |
n_sep_by_space | Ist TRUE, wenn ein Leerzeichen das Währungssymbol von einem negativen Wert trennt, ansonsten FALSE. |
p_sign_posn |
|
n_sign_posn |
|
p_sign_posn und n_sign_posn enthalten einen String mit Formatierungsinformationen. Jeder Wert repräsentiert eine der oben aufgeführten Bedingungen.
Die Gruppierungsfelder enthalten Arrays, die die Art und Weise definieren, in der Zahlen gruppiert werden sollten. Beispielsweise würde das Gruppierungsfeld für Geldbeträge unter einer nl_NL-Locale (im UTF-8-Modus mit dem Euro-Zeichen) ein Array mit zwei Einträgen mit den Werten 3 und 3 enthalten. Je höher der Index im Array, desto weiter links wird gruppiert. Wenn ein Arrayelement CHAR_MAX entspricht, wird keine weitere Gruppierung angewendet. Ist ein Arrayelement gleich 0, sollte das vorangegangene Element verwendet werden.
Beispiel #1 localeconv()-Beispiel
<?php
if (false !== setlocale(LC_ALL, 'nl_NL.UTF-8@euro')) {
$locale_info = localeconv();
print_r($locale_info);
}
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
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 ) )
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";
?>
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])...