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 — Ανακτείστε πληροφορίες για το σχηματισμό αριθμών
Περιγραφή
Επιστρέφει έναν associative πίνακα, που περιέχει τοπικές πληροφορίες για το σχηματισμό αριθμών και νομισματικών ποσοτήτων.
Η συνάρτηση localeconv() επιστρέφει δεδομένα που βασίζονται στο τρέχων locale όπως αυτά ορίζονται από τη συνάρτηση setlocale(). Ο πίνακας, που επιστρέφεται, περιέχει τα ακόλουθα πεδία:
| Στοιχείο πίνακα | Περιγραφή |
|---|---|
| decimal_point | Χαρακτήρας δεκαδικού σημείου |
| thousands_sep | Χαρακτήρας διάκρισης των χιλιάδων |
| grouping | Πίνακας που περιέχει τα αριθμητικά groupings |
| int_curr_symbol | Διεθνές σύμβολο νομίσματος (π.χ. USD) |
| currency_symbol | Τοπικό σύμβολο νομίσματος (π.χ. $) |
| mon_decimal_point | Χαρακτήρας δεκαδικού σημείου για νομίσματα |
| mon_thousands_sep | Χαρακτήρας διάκρισης χιλιάδων για νομίσματα |
| mon_grouping | Πίνακας που περιέχει τα νομισματικά groupings |
| positive_sign | Σύμβολο για θετικές τιμές |
| negative_sign | Σύμβολο για αρνητικές τιμές |
| int_frac_digits | Διεθνή κλασματικά ψηφία |
| frac_digits | Τοπικά κλασματικά ψηφία |
| p_cs_precedes | Είναι TRUE εάν το currency_symbol προηγείται μίας θετικής τιμής, ενώ είναι FALSE εάν έπεται μιας. |
| 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 |
|
Τα πεδία grouping περιέχουν πίνακες που ορίζουν τον τρόπο με τον οποίο θα πρέπει να ομαδοποιούνται οι αριθμοί. Για παράδειγμα, το πεδίο grouping για το en_US locale, πρέπει να περιέχει έναν πίνακα δύο στοιχείων 2 item με τις τιμές 3 και 3. Όσο μεγαλύτερος είναι ο δείκτης σε έναν πίνακα τόσο μεγαλύτερη είναι η ομαδοποίηση στα αριστερά αυτού. Εάν ένα στοιχείο πίνακα είναι ίσο με CHAR_MAX, δεν επιτρέπεται άλλη ομαδοποίηση. Εάν ένα στοιχείο πίνακα είναι ίσο με 0, θα πρέπει να χρησιμοποιηθεί το προηγούμενο από αυτό στοιχείο.
Example#1 Παράδειγμα χρήσης της localeconv()
<?php
setlocale(LC_ALL, "en_US");
$locale_info = localeconv();
echo "<PRE>\n";
echo "--------------------------------------------\n";
echo " Monetary information for current locale: \n";
echo "--------------------------------------------\n\n";
echo "int_curr_symbol: {$locale_info["int_curr_symbol"]}\n";
echo "currency_symbol: {$locale_info["currency_symbol"]}\n";
echo "mon_decimal_point: {$locale_info["mon_decimal_point"]}\n";
echo "mon_thousands_sep: {$locale_info["mon_thousands_sep"]}\n";
echo "positive_sign: {$locale_info["positive_sign"]}\n";
echo "negative_sign: {$locale_info["negative_sign"]}\n";
echo "int_frac_digits: {$locale_info["int_frac_digits"]}\n";
echo "frac_digits: {$locale_info["frac_digits"]}\n";
echo "p_cs_precedes: {$locale_info["p_cs_precedes"]}\n";
echo "p_sep_by_space: {$locale_info["p_sep_by_space"]}\n";
echo "n_cs_precedes: {$locale_info["n_cs_precedes"]}\n";
echo "n_sep_by_space: {$locale_info["n_sep_by_space"]}\n";
echo "p_sign_posn: {$locale_info["p_sign_posn"]}\n";
echo "n_sign_posn: {$locale_info["n_sign_posn"]}\n";
echo "</PRE>\n";
?>
Η σταθερά CHAR_MAX χρησιμοποιείται και για την προαναφερθείσα χρήση.
Ανατρέξτε επίσης στη setlocale().
localeconv
24-Nov-2007 01:15
22-Jul-2001 07: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])...
