note 14242 deleted from function.localeconv by aidan

From: 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>

« previous php.notes (#76561) next »