为什么在转换为字符串时小数点中的点被逗号替换?

Pie*_*mol 0 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)); // Outputs: string(6) "12.345"
echo $var; // Outputs: 12,345
Run Code Online (Sandbox Code Playgroud)

是什么导致了这种行为?


这个问题适用于 PHP < 8。根据文档

自 PHP 8.0.0 起,小数点字符始终为.. 在 PHP 8.0.0 之前,小数点字符在脚本的语言环境(类别 LC_NUMERIC)中定义。请参阅 setlocale() 函数。

Bob*_*bot 5

如果你阅读手册,或者用谷歌检查,你会发现这个

小数点字符在脚本的语言环境中定义(类别 LC_NUMERIC)

现在,如果您想知道 sys 上设置的小数点是哪个:

print_r(localeconv());
Run Code Online (Sandbox Code Playgroud)

返回:

Array
(
    [decimal_point] => .
    [...many other confs...]
)
Run Code Online (Sandbox Code Playgroud)

如果你想设置它使用好的语言: setlocale(LC_NUMERIC, $language)

我曾经fr_FR得到一个逗号和en_US一个点。

你应该参考setlocale()手册

顺便说一句,我不知道如何在不更改整个LC_NUMERIC confsdecimal_pointlocaleconv()情况下直接设置返回的数组的键,如果有人知道,请编辑:)