String 当转换为字符串时,为什么十进制中的点被逗号替换?
在PHP中,我发现当一个十进制数被打印到屏幕上时(或者:当它转换为字符串时),十进制分隔符也会转换为逗号。 但为什么呢? 我还没有找到任何关于这方面的文档,而且我认为转换为字符串不会考虑国际化设置 示例代码:String 当转换为字符串时,为什么十进制中的点被逗号替换?,string,casting,decimal,php-7,String,Casting,Decimal,Php 7,在PHP中,我发现当一个十进制数被打印到屏幕上时(或者:当它转换为字符串时),十进制分隔符也会转换为逗号。 但为什么呢? 我还没有找到任何关于这方面的文档,而且我认为转换为字符串不会考虑国际化设置 示例代码: $var = 12.345; var_dump($var); // Outputs: double(12.345) var_dump((string)$var); // Outputs: string(6) "12,345" var_dump(str_replace(
$var = 12.345;
var_dump($var); // Outputs: double(12.345)
var_dump((string)$var); // Outputs: string(6) "12,345"
var_dump(str_replace(',', '.', $var)); // Outputs: string(6) "12.345"
echo $var; // Outputs: 12,345
是什么导致了这种行为
这个问题适用于PHP<8 从PHP 8.0.0开始,小数点字符始终为
。在PHP8.0.0之前,小数点字符是在脚本的区域设置中定义的(类别LC\U NUMERIC)。请参阅setlocale()函数
如果你阅读手册,或者通过谷歌查询,你会发现 小数点字符是在脚本的区域设置中定义的 (分类LC\U数字) 现在,如果您想知道系统上设置的小数点是什么:
print_r(localeconv());
返回:
Array
(
[decimal_point] => .
[...many other confs...]
)
如果要设置它,请使用良好的语言:setlocale(LC\u NUMERIC,$language)
我用fr\u fr
得到一个逗号,用en\u US
得到一个点
你应该参考
顺便说一句,我不知道如何直接设置由
localeconv()
返回的数组的decimal\u point
键,而不更改整个LC\u数字格式,如果有人知道,请编辑:)如果您阅读手册,或者与谷歌联系,您会发现
小数点字符是在脚本的区域设置中定义的
(分类LC\U数字)
现在,如果您想知道系统上设置的小数点是什么:
print_r(localeconv());
返回:
Array
(
[decimal_point] => .
[...many other confs...]
)
如果要设置它,请使用良好的语言:setlocale(LC\u NUMERIC,$language)
我用fr\u fr
得到一个逗号,用en\u US
得到一个点
你应该参考
顺便说一句,我不知道如何直接设置由
localeconv()
返回的数组的decimal\u point
键,而不更改整个LC\u NUMERIC conf,如果有人知道,请在使用str\u replace时编辑:)。它正在转换为字符串,这就是为什么..嗯,将浮点数转换为字符串不会将
转换为,
RTFM:)“我认为转换为字符串不会考虑国际化设置”
:-哦,是的,它会<代码>小数点字符在脚本的区域设置中定义(类别LC\U NUMERIC)。请参阅setlocale()函数。@Piemol您确实需要开始正确阅读手册:)当您使用str_replace时..它正在转换为字符串,这就是为什么..呃,将浮点转换为字符串不会将
转换为,
RTFM:)“我不认为强制转换为字符串会考虑国际化设置”
:-哦,是的!小数点字符是在脚本的区域设置中定义的(类别LC\u NUMERIC)。请参阅setlocale()函数。@Piemol您确实需要开始正确阅读手册:)这里是另一个示例,但如果您使用50,3而不是50.3 setlocale(LC_NUMERIC,'德语');setlocale(LC_MONETARY,'德语');这里是另一个例子,但如果您使用50,3而不是50.3 setlocale(LC_NUMERIC,'German');setlocale(LC_MONETARY,'German');