#44041 [WFx]: number_format returns garbage for thousands sep and latvian locale
| From: | stas@php.net | Date: | Fri, 08 Feb 2008 23:14:51 +0000 |
| Subject: | #44041 [WFx]: number_format returns garbage for thousands sep and latvian locale | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-122103@lists.php.net to get a copy of this message | ||
ID: 44041
Updated by: stas@php.net
Reported By: trickie at gmail dot com
Status: Wont fix
Bug Type: *General Issues
Operating System: Gentoo Linux
PHP Version: 5.2.5
New Comment:
You may also want to look at http://pecl.php.net/package/intl
Previous Comments:
------------------------------------------------------------------------
[2008-02-07 07:40:23] trickie at gmail dot com
Thanks for the tip.
------------------------------------------------------------------------
[2008-02-07 00:42:29] jani@php.net
The "garbage" you get is a non-breaking space in UTF-8. You can always
use utf_decode() on it:
<?php
if (false !== setlocale(LC_ALL, 'lv_LV.UTF-8')) {
$locale_info = localeconv();
echo number_format(20000,0,$locale_info['decimal_point'],
utf8_decode($locale_info['thousands_sep']));
}
?>
Since unicode support is coming in PHP6 and will not be addressed
before, this is "wont fix" in earlier versions.
I suggest you really don't use setlocale() if you want to use UTF-8.
At least not for numbers.
------------------------------------------------------------------------
[2008-02-05 07:31:30] trickie at gmail dot com
Output requested:
array(18) {
["decimal_point"]=>
string(1) ","
["thousands_sep"]=>
string(2) "��"
["int_curr_symbol"]=>
string(4) "LVL "
["currency_symbol"]=>
string(2) "Ls"
["mon_decimal_point"]=>
string(1) ","
["mon_thousands_sep"]=>
string(2) "��"
["positive_sign"]=>
string(0) ""
["negative_sign"]=>
string(1) "-"
["int_frac_digits"]=>
int(2)
["frac_digits"]=>
int(2)
["p_cs_precedes"]=>
int(1)
["p_sep_by_space"]=>
int(1)
["n_cs_precedes"]=>
int(1)
["n_sep_by_space"]=>
int(1)
["p_sign_posn"]=>
int(3)
["n_sign_posn"]=>
int(3)
["grouping"]=>
array(2) {
[0]=>
int(3)
[1]=>
int(3)
}
["mon_grouping"]=>
array(2) {
[0]=>
int(3)
[1]=>
int(3)
}
}
------------------------------------------------------------------------
[2008-02-05 05:09:48] jani@php.net
What does this output:
<?php
if (false !== setlocale(LC_ALL, 'lv_LV.UTF-8')) {
$locale_info = localeconv();
var_dump($locale_info);
}
?>
------------------------------------------------------------------------
[2008-02-04 15:18:20] trickie at gmail dot com
Description:
------------
If you set the locale to 'lv_LV.UTF-8' and have the locale generated on
your system, then the code below will return garbage as the 'thousands
separator'. It displays ok for me when running with CLI SAPI
Reproduce code:
---------------
<?php
if (false !== setlocale(LC_ALL, 'lv_LV.UTF-8')) {
$locale_info = localeconv();
echo number_format(20000,0,$locale_info['decimal_point'],
$locale_info['thousands_sep']);
}
?>
Expected result:
----------------
20 000
Actual result:
--------------
20�000
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=44041&edit=1