intl
我在Plesk 使用 PHP 7.1 安装的扩展上遇到了完全相同的问题。
$ /opt/plesk/php/7.1/bin/php -a
Interactive shell
php > $a = new \NumberFormatter("es_ES", \NumberFormatter::CURRENCY);
php > echo $a->format(12345.12345);
€ 12.345,12
这些是它使用的 ICU 版本,如下所示/opt/plesk/php/7.1/bin/php -i
:
version => 1.1.0
ICU version => 4.2.1
为了解决这个问题,我必须从源代码编译一个较新版本的 ICU(我能够正确编译的最新版本是 58.2),然后还intl
使用该 ICU 从源代码编译我的 PHP 版本的扩展(因为我正在使用 Plesk PHP的二进制文件是它使用的):
wget http://download.icu-project.org/files/icu4c/58.2/icu4c-58_2-src.tgz
tar xzvf icu4c-58_2-src.tgz
cd icu/source/
CXXFLAGS="-std=c++0x" ./runConfigureICU Linux --prefix=/opt/icu4c-58_2
make
sudo make install
cd ../../
wget http://php.net/distributions/php-7.1.22.tar.gz
tar xzvf php-7.1.22.tar.gz
cd php-7.1.22/ext/intl
/opt/plesk/php/7.1/bin/phpize
./configure --with-php-config=/opt/plesk/php/7.1/bin/php-config --enable-intl --with-icu-dir=/opt/icu4c-58_2
make
sudo make install
然后确保加载了扩展,在我的例子中/opt/plesk/php/7.1/etc/php.d/intl.ini
:
; Enable intl extension module
extension=intl.so
然后重新启动或重新加载 httpd、Apache、PHP-FPM 或任何正在加载 PHP 的东西:
sudo service httpd restart
目前显示的版本/opt/plesk/php/7.1/bin/php -i
:
version => 1.1.0
ICU version => 58.2
ICU Data version => 58.2
现在货币已正确显示:
$ /opt/plesk/php/7.1/bin/php -a
Interactive shell
php > $a = new \NumberFormatter("es_ES", \NumberFormatter::CURRENCY);
php > echo $a->format(12345.12345);
12.345,12 €