String 当转换为字符串时,为什么十进制中的点被逗号替换?

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(

在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)); // 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');