note 14242 deleted from function.localeconv by aidan
| From: | aidan@php.net | Date: | Sun, 12 Sep 2004 23:36:13 +0000 |
| Subject: | note 14242 deleted from function.localeconv by aidan | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-76561@lists.php.net to get a copy of this message | ||
Note Submitter: verdy_p at wanadoo dot fr
----
Here is a more complete example, that works and shows the effect of currency values formatting in
several locales:
<HTML><BODY>
<H1>Information about locales<H1>
<?
echo '<TABLE WIDTH="100%"><TR>';
echo '<TD WIDTH="50%">'; localeinfo(setlocale(LC_ALL,0)); echo
'</TD>';
echo '<TD WIDTH="50%">'; localeinfo("fr_FR"); echo
'</TD>';
echo '</TR><TR>';
echo '<TD WIDTH="50%">'; localeinfo("en_US"); echo
'</TD>';
echo '<TD WIDTH="50%">'; localeinfo("de_DE"); echo
'</TD>';
echo '</TR><TR>';
echo '<TD WIDTH="50%">'; localeinfo("es_ES"); echo
'</TD>';
echo '<TD WIDTH="50%">'; localeinfo("it_IT"); echo
'</TD>';
echo '</TR><TR>';
echo '<TD WIDTH="50%">'; localeinfo("ru_RU"); echo
'</TD>';
echo '<TD WIDTH="50%">'; localeinfo("ja_JP"); echo
'</TD>';
echo '</TR></TABLE>';
function localeinfo($locale_name) {
$locale = getlocaleconv($locale_name);
echo "<H2>Locale : '$locale_name'</H2>\n";
echo '<TEXTAREA cols="44" rows="10">';
foreach ($locale[grouping] as $key => $value) {
if (strlen($grouping) > 0) $grouping .= ", ";
$grouping .= $key . "=>'" . $value . "'";
}
$grouping = 'array(' . $grouping . ')';
echo "\n";
echo "decimal_point: '" . $locale[decimal_point] . "'\n";
echo "negative_sign: '" . $locale[negative_sign] . "'\n";
echo "positive_sign: '" . $locale[positive_sign] . "'\n";
echo "thousands_sep: '" . $locale[thousands_sep] . "'\n";
echo "grouping: " . $grouping . "\n";
echo "\n";
echo "mon_decimal_point: '" . $locale[mon_decimal_point] . "'\n";
echo "mon_negative_sign: '" . $locale[mon_negative_sign] . "'\n";
echo "mon_positive_sign: '" . $locale[mon_positive_sign] . "'\n";
echo "mon_thousands_sep: '" . $locale[mon_thousands_sep] . "'\n";
echo "\n";
echo "currency_symbol: '" . $locale[currency_symbol] . "'\n";
echo "frac_digits: " . $locale[frac_digits] . "\n";
echo "p_cs_precedes: " . ($locale[p_cs_precedes] ? "true" :
"false") . "\n";
echo "n_cs_precedes: " . ($locale[n_cs_precedes] ? "true" :
"false") . "\n";
echo "p_sep_by_space: " . $locale[p_sep_by_space] . "\n";
echo "n_sep_by_space: " . $locale[n_sep_by_space] . "\n";
echo "p_sign_posn: " . $locale[p_sign_posn] . "\n";
echo "n_sign_posn: " . $locale[n_sign_posn] . "\n";
samp("positive sample: ",
$locale[grouping],
$locale[mon_thousands_sep],
$locale[mon_decimal_point],
$locale[mon_positive_sign],
substr($locale[int_curr_symbol], 3, 1),
$locale[currency_symbol],
$locale[frac_digits],
$locale[p_cs_precedes],
$locale[p_sep_by_space],
$locale[p_sign_posn]);
samp("negative sample: ",
$locale[grouping],
$locale[mon_thousands_sep],
$locale[mon_decimal_point],
$locale[mon_negative_sign],
substr($locale[int_curr_symbol], 3, 1),
$locale[currency_symbol],
$locale[frac_digits],
$locale[n_cs_precedes],
$locale[n_sep_by_space],
$locale[n_sign_posn]);
echo "\n";
echo "int_curr_symbol: '" . $locale[int_curr_symbol] . "'\n";
echo "int_frac_digits: " . $locale[int_frac_digits] . "\n";
echo "int_p_cs_precedes: " . ($locale[int_p_cs_precedes] ? "true" :
"false") . "\n";
echo "int_n_cs_precedes: " . ($locale[int_n_cs_precedes] ? "true" :
"false") . "\n";
echo "int_p_sep_by_space:" . $locale[int_p_sep_by_space] . "\n";
echo "int_n_sep_by_space:" . $locale[int_n_sep_by_space] . "\n";
echo "int_p_sign_posn: " . $locale[int_p_sign_posn] . "\n";
echo "int_n_sign_posn: " . $locale[int_n_sign_posn] . "\n";
samp("positive sample: ",
$locale[grouping],
$locale[mon_thousands_sep],
$locale[mon_decimal_point],
$locale[mon_positive_sign],
substr($locale[int_curr_symbol], 3, 1),
substr($locale[int_curr_symbol], 0, 3),
$locale[int_frac_digits],
$locale[int_p_cs_precedes],
$locale[int_p_sep_by_space],
$locale[int_p_sign_posn]);
samp("negative sample: ",
$locale[grouping],
$locale[mon_thousands_sep],
$locale[mon_decimal_point],
$locale[mon_negative_sign],
substr($locale[int_curr_symbol], 3, 1),
substr($locale[int_curr_symbol], 0, 3),
$locale[int_frac_digits],
$locale[int_n_cs_precedes],
$locale[int_n_sep_by_space],
$locale[int_n_sign_posn]);
echo "\n";
echo "</TEXTAREA>\n";
}
function getlocaleconv($locale_name) {
global $localeconv;
if (!isset($locales))
$localeconv = array();
if (isset($localeconv[$locale_name]))
return $localeconv[$locale_name];
$old_locale = setlocale(LC_ALL, 0);
setlocale(LC_ALL, $locale_name);
$locale = localeconv();
setlocale(LC_ALL, $old_locale);
if (!isset($locale[decimal_point]))
$locale[decimal_point] = '.';
if (!isset($locale[negative_sign]) || $locale[negative_sign] == "")
$locale[negative_sign] = '-';
if (!isset($locale[positive_sign]))
$locale[positive_sign] = '';
if (!isset($locale[thousands_sep])) {
if ($locale[decimal_point] == ',')
$locale[thousands_sep] = ' ';
else
$locale[thousands_sep] = ',';
}
if (!isset($locale[grouping]) || empty($locale[grouping]))
$locale[grouping] = array(3);
if (!isset($locale[mon_decimal_point]) || $locale[mon_decimal_point] == '')
$locale[mon_decimal_point] = $locale[decimal_point];
if (!isset($locale[mon_negative_sign]) || $locale[mon_negative_sign] == '')
$locale[mon_negative_sign] = $locale[negative_sign];
if (!isset($locale[mon_positive_sign]) || $locale[mon_positive_sign] == '')
$locale[mon_positive_sign] = '';
if (!isset($locale[mon_thousands_sep]) || $locale[mon_thousands_sep] == '') {
$locale[mon_thousands_sep] = $locale[thousands_sep];
if ($locale[mon_thousands_sep] == $locale[mon_decimal_point]) {
if ($locale[mon_decimal_point] == ',')
$locale[mon_thousands_sep] = ' ';
else
$locale[mon_thousands_sep] = ',';
}
}
if (!isset($locale[currency_symbol]))
$locale[currency_symbol] = '$';
if (!isset($locale[frac_digits]))
$locale[frac_digits] = 2;
if (!isset($locale[p_cs_precedes]))
$locale[p_cs_precedes] = 1;
if (!isset($locale[n_cs_precedes]))
$locale[n_cs_precedes] = $locale[p_cs_precedes];
if (!isset($locale[p_sep_by_space]))
$locale[p_sep_by_space] = 0;
if (!isset($locale[n_sep_by_space]))
$locale[n_sep_by_space] = $locale[p_sep_by_space];
if (!isset($locale[p_sign_posn]))
$locale[p_sign_posn] = 0;
if (!isset($locale[n_sign_posn]))
$locale[n_sign_posn] = $locale[p_sign_posn];
if (!isset($locale[int_curr_symbol])) {
// Ugly defaults, try to get the international country code...
if (strlen($locale_name) >= 5 && substr($locale_name.substring,2,1) == '_')
$locale[int_curr_symbol] = strtoupper(substr($locale_name.substring, 2, 2));
else if (strlen($locale_name) >= 2)
$locale[int_curr_symbol] = strtoupper(substr($locale_name.substring, 0, 2));
else
$locale[int_curr_symbol] = 'XX';
}
if (strlen($locale[currency_symbol]) == 2) {
// Ugly defaults: try to get the international currency initial
if (substr($locale[currency_symbol], 1, 1) == '$')
$locale[int_curr_symbol] .= 'D';
else if (substr($locale[currency_symbol], 1, 1) == '£')
$locale[int_curr_symbol] .= 'P';
else if (substr($locale[currency_symbol], 1, 1) == '')
$locale[int_curr_symbol] .= 'G';
else if (substr($locale[currency_symbol], 1, 1) == '¥')
$locale[int_curr_symbol] .= 'Y';
else if (substr($locale[currency_symbol], 1, 1) == 'DM')
$locale[int_curr_symbol] .= 'M';
else if (isletter(substr($locale[currency_symbol], 1, 1)))
$locale[int_curr_symbol] .= strtoupper(substr($locale[currency_symbol], 1, 1));
else // Unknown currency code for this country code
$locale[int_curr_symbol] .= 'X';
}
// Default grouping space separator
if (strlen($locale[int_curr_symbol]) == 3)
$locale[int_curr_symbol] .= ' ';
if (!isset($locale[int_frac_digits]))
$locale[int_frac_digits] = $locale[frac_digits];
if (!isset($locale[int_p_cs_precedes]))
$locale[int_p_cs_precedes] = $locale[p_cs_precedes];
if (!isset($locale[int_n_cs_precedes]))
$locale[int_n_cs_precedes] = $locale[n_cs_precedes];
if (!isset($locale[int_p_sep_by_space]))
$locale[int_p_sep_by_space] = $locale[p_sep_by_space];
if (!isset($locale[int_n_sep_by_space]))
$locale[int_n_sep_by_space] = $locale[n_sep_by_space];
if (!isset($locale[int_p_sign_posn]))
$locale[int_p_sign_posn] = $locale[p_sign_posn];
if (!isset($locale[int_n_sign_posn]))
$locale[int_n_sign_posn] = $locale[n_sign_posn];
return $localeconv[$locale_name] = $locale;
}
function samp($title,
$grouping, $thousands_sep, $decimal_point, $sign, $space,
$currency_symbol, $frac_digits, $cs_precedes, $sep_by_space, $sign_posn) {
$mon_format = array(
// 1, $ succedes , $ precedes 1
// ( precedes, $1, ) succedes
0=> array(0=> array(0=> '(1$)' , 1=> '($1)' ), // no space
1=> array(0=> '(1 $)', 1=> '($ 1)'), // space sep +$ 1
2=> array(0=> '(1 $)', 1=> '($ 1)')), // space sep + $1
// + precedes, $1
1=> array(0=> array(0=> '+1$' , 1=> '+$1' ), // no space
1=> array(0=> '+1 $' , 1=> '+$ 1' ), // space sep $ 1
2=> array(0=> '+1 $' , 1=> '+ $1' )), // space sep $ +
// $1, + succedes
2=> array(0=> array(0=> '1$+' , 1=> '$1+' ), // no space
1=> array(0=> '1 $+' , 1=> '$ 1+' ), // space sep $ 1
2=> array(0=> '1$ +' , 1=> '$1 +' )), // space sep $ +
// + precedes, $
3=> array(0=> array(0=> '1+$' , 1=> '+$1' ), // no space
1=> array(0=> '1 +$' , 1=> '+$ 1' ), // space sep $ 1
2=> array(0=> '1+ $' , 1=> '+ $1' )), // space sep $ +
// $, + succedes
4=> array(0=> array(0=> '1$+' , 1=> '$+1' ), // no space
1=> array(0=> '1 $+' , 1=> '$+ 1' ), // space sep $ 1
2=> array(0=> '1$ +' , 1=> '$ +1' ))); // space sep $ +
/* format a sample number */
$gl = $gn = isset($grouping[$gi = 0]) ? $grouping[$gi] : 0;
for ($num = '', $i = 0; $i < 10; $i++) {
if ($gn == 0) {
if (isset($grouping[$gi + 1]))
$gi++;
if (isset($grouping[$gi]))
$gn = $grouping[$gi];
if ($gn == 0)
$gn = $gl;
else
$gl = $gn;
$num = $thousands_sep . $num;
}
$gn--;
$num = $i . $num;
}
if ($frac_digits == 127)
$frac_digits = 2;
if ($frac_digits > 0) {
$num .= $decimal_point;
for ($i = 0; $i < $frac_digits; $i++)
$num .= $i < 10 ? $i : 0;
}
$format = $mon_format
[$sign_posn == 127 ? 1 : $sign_posn]
[$sep_by_space == 127 ? 1 : $sep_by_space]
[$cs_precedes == 127 ? 1 : $cs_precedes];
/* final formatting */
for ($sample = '', $i = 0; $i < strlen($format); $i++) {
$code = substr($format, $i, 1);
if ($code == ' ') $sample .= $space;
else if ($code == '$') $sample .= $currency_symbol;
else if ($code == '+') $sample .= $sign;
else if ($code == '1') $sample .= $num;
}
echo $title . "'" . $sample . "' (format:" . $format .
")\n";
}
?>
</BODY></HTML>