[Docker][PHP] NumberFormatter::formatCurrency 7.4.29 和 7.4.28 之间不兼容
[Docker][PHP] NumberFormatter::formatCurrency incompatible between 7.4.29 and 7.4.28
(与 https://github.com/docker-library/php/issues/1301 相同)
运行 以下脚本的结果在 php:7.4.29-fpm-alpine
和 php:7.4.28-fpm-alpine
之间不同。
<?php
$fmt = new \NumberFormatter('JA_JP', \NumberFormatter::CURRENCY);
$formatString = $fmt->formatCurrency(0, 'JPY');
var_dump($formatString);
结果
php:7.4.28-fpm-alpine(我预计)
string(4) "¥0"
php:7.4.29-fpm-alpine
string(3) "¥0"
(我的)问题
有什么方法可以使 php:7.4.29-fpm-alpine
中的结果与 php:7.4.28-fpm-alpine
中的结果相同吗? (有解决方法吗?)
复制方式
参见 https://github.com/sogaoh/reproduce-incompatibility-of-format-currency (README.md)
备注
(未确认)我猜
之间也有类似的问题
- 8.0.19 和 8.0.18
- 8.1.6 和 8.1.5
两者的区别在于.28版本使用\uffe5
'全角日元符号,.29版本使用\u00a5
'日元符号
如 github 问题评论中所述,这可能是图像构建之间底层 ICU 库的变化,而不是图像、Alpine 或 PHP 本身的问题.作为临时修复,您可以使用修改后的图像来安装 ICU 的固定版本,但 YMMV。
或者,您可以使用简单的替代方法填充,例如:
str_replace("\xc2\xa5", "\xef\xbf\xa5", $formatter_output);
尽管这个问题本身很表面化,而且 IMO 最初使用全角字形作为货币符号是更值得怀疑的选择。
我的解决方案:
另外安装 package: icu-data-full。
参考资料
(与 https://github.com/docker-library/php/issues/1301 相同)
运行 以下脚本的结果在 php:7.4.29-fpm-alpine
和 php:7.4.28-fpm-alpine
之间不同。
<?php
$fmt = new \NumberFormatter('JA_JP', \NumberFormatter::CURRENCY);
$formatString = $fmt->formatCurrency(0, 'JPY');
var_dump($formatString);
结果
php:7.4.28-fpm-alpine(我预计)
string(4) "¥0"
php:7.4.29-fpm-alpine
string(3) "¥0"
(我的)问题
有什么方法可以使 php:7.4.29-fpm-alpine
中的结果与 php:7.4.28-fpm-alpine
中的结果相同吗? (有解决方法吗?)
复制方式
参见 https://github.com/sogaoh/reproduce-incompatibility-of-format-currency (README.md)
备注
(未确认)我猜
之间也有类似的问题- 8.0.19 和 8.0.18
- 8.1.6 和 8.1.5
两者的区别在于.28版本使用\uffe5
'全角日元符号,.29版本使用\u00a5
'日元符号
如 github 问题评论中所述,这可能是图像构建之间底层 ICU 库的变化,而不是图像、Alpine 或 PHP 本身的问题.作为临时修复,您可以使用修改后的图像来安装 ICU 的固定版本,但 YMMV。
或者,您可以使用简单的替代方法填充,例如:
str_replace("\xc2\xa5", "\xef\xbf\xa5", $formatter_output);
尽管这个问题本身很表面化,而且 IMO 最初使用全角字形作为货币符号是更值得怀疑的选择。
我的解决方案:
另外安装 package: icu-data-full。
参考资料