Edit report at https://bugs.php.net/bug.php?id=53791&edit=1

 ID:                 53791
 Updated by:         der...@php.net
 Reported by:        jinmoku at hotmail dot com
 Summary:            NumberFormat::parse fail with French thousands
                     separator
-Status:             Closed
+Status:             Feedback
 Type:               Bug
 Package:            I18N and L10N related
 PHP Version:        5.3.5
 Block user comment: N
 Private report:     N

 New Comment:

4.8.1 gives:

derick@whisky:/tmp$ ./unum fr_FR "1 234.56"
1234.000000

derick@whisky:/tmp$ ./unum fr_FR "1 234,56"
1234.560000

derick@whisky:/tmp$ ./unum fr_FR "1234,56"
1234.560000


Previous Comments:
------------------------------------------------------------------------
[2012-02-21 10:00:13] jinmoku at hotmail dot com

This is not a bug, the real test should be 


-------------------------------
$nombre = 1234.56;
$fmt = new NumberFormatter('fr_FR', NumberFormatter::DECIMAL);
var_dump($fmt->format($nombre));

$nombre = "1\xc2\xa0234,56";
$fmt = new NumberFormatter('fr_FR', NumberFormatter::DECIMAL);
var_dump($fmt->parse($nombre));

$nombre = '1234,56';
$fmt = new NumberFormatter('fr_FR', NumberFormatter::DECIMAL);
var_dump($fmt->parse($nombre));
-------------------------------

-------------------------------
string(9) "1 234,56"
float(1234.56)
float(1234.56)
-------------------------------

------------------------------------------------------------------------
[2012-02-21 09:44:13] ras...@php.net

I spent a bit of time looking at this tonight. As far as I can tell there is 
nothing wrong on the PHP side here. A quick ICU test program that reproduces 
this bug is here:

== [unum.c] ========================
#include <stdio.h>
#include "unicode/utypes.h"
#include "unicode/unum.h"
#include "unicode/uloc.h"
#include "unicode/umisc.h"
#include "unicode/parseerr.h"

void main(int argc, char *argv[]) {
  UChar tmp[64];
  UNumberFormat *cur_def;
  int32_t parsepos = 0;
  UErrorCode status=U_ZERO_ERROR;
  UNumberFormatStyle style= UNUM_DEFAULT;
  double d;

  cur_def = unum_open(style, NULL, 0, argv[1], NULL, &status);  
  if(U_FAILURE(status)) printf("Error1: %s\n", u_errorName(status));
  u_uastrcpy(tmp, argv[2]);
  d = unum_parseDouble(cur_def, tmp, u_strlen(tmp), &parsepos, &status);
  if(U_FAILURE(status)) printf("Error2: %s\n", u_errorName(status));
  printf("%f\n",d);
}

Compile with:

gcc -o unum unum.c -ldl -lm -L/usr/lib -licui18n -licuuc -licudata -ldl -lm

or check what your flags should be on your platform with:

/usr/bin/icu-config --ldflags

then run it like this:

$ ./unum fr_FR "1234,56"
1234.560000
$ ./unum fr_FR "1 234,56"
1.000000

I get this with ICU 4.4.2 on Ubuntu.

Could someone please try this on ICU 4.6 or 4.8?

------------------------------------------------------------------------
[2011-12-10 04:57:26] playa71 at gmail dot com

Running PHP 5.3.8 on Win7 - this problem still happens.

Amazing in 2011 a programming language exists that doesn't support entire 
countries! sigh.

------------------------------------------------------------------------
[2011-09-05 17:03:26] paj...@php.net

Please try using this snapshot:

  http://snaps.php.net/php5.3-latest.tar.gz
 
For Windows:

  http://windows.php.net/snapshots/

or 5.3.8

------------------------------------------------------------------------
[2011-09-05 16:56:50] jinmoku at hotmail dot com

in fact the french group sep is not a "space" but a "no-breaking space"

------------------------------------------------------------------------


The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at

    https://bugs.php.net/bug.php?id=53791


-- 
Edit this bug report at https://bugs.php.net/bug.php?id=53791&edit=1

Reply via email to