在php中使用double类型的区域设置会导致很多问题


Using locales in php with type double causing lot's of problems

我浪费了一些时间在与mysql相结合的学说中发现一个错误,其中双2.5不断被存储为2.0。我发现使用德国本地de_DE,使用十进制分隔符,而不是.,这导致学说创建一个sql查询,如

insert into table (doubleColumn) values('2,5') -- will result in a 2.0

在php

中使用这些行可以重复这个问题
$a=2.5;
printf("%s",$a); // prints out 2.5
echo $a; // prints out 2.5
setlocale(LC_ALL,"de_DE");
printf("%s",$a); // prints out 2,5
echo $a; // prints out 2,5
echo "my number " . $a; // also results in a 2,5

所以我的问题是,为什么php使用当前区域设置转换类型,如double到字符串。在Java中不是这样的

Double a = 2.5;
System.out.println(a.toString()); // prints out 2.5
Locale.setDefault(Locale.GERMAN);
System.out.println(a.toString()); // still prints out 2.5

是否有任何原因php是使用当前设置的区域设置的字符串转换?

我想你的意思是使用printf("%f", $a);(因为你的代码在这里工作得很好)。答案在文档中:

http://fr2.php.net/manual/en/function.sprintf.php

f -参数被视为浮点数,并表示为浮点数(语言环境敏感)。

F -参数被视为浮点数,并表示为浮点数(非语言环境感知)。从PHP 4.3.10和PHP 5.0.3开始提供。

所以你应该使用%F