
NumberFormatter 初始化失败:找不到 intl 扩展
PHP 报 Class 'NumberFormatter' not found 或 Call to undefined class NumberFormatter,基本就是 intl 扩展没启用。这不是代码问题,是环境配置缺失。
- Linux(如 Ubuntu):运行
sudo apt install php-intl,然后重启 Web 服务(sudo systemctl restart apache2或sudo systemctl restart php-fpm) - macOS(Homebrew + PHP):执行
brew install icu4c && pecl install intl,并在php.ini中确认有extension=intl - Windows:打开
php.ini,取消注释;extension=php_intl.dll,确保icu*.dll文件在 PHP 的ext目录且系统 PATH 可达 - 用
php -m | grep intl或phpinfo()页面确认intl已加载,否则后续所有调用都会直接报错
NumberFormatter::SPELLOUT 不支持中文 locale 的数字读法
想用 zh_CN 或 zh_Hans 让 NumberFormatter 输出“一百二十三”,会发现它只返回空字符串或原始数字——因为 NumberFormatter::SPELLOUT 在 ICU 数据中**仅对英文、法文、德文等少数语言提供拼写规则,中文没有内置实现**。
- 可用的 locale 示例:
en_US、fr_FR、de_DE、es_ES;zh_CN、ja_JP、ko_KR均不支持SPELLOUT - 验证方式:
var_dump((new NumberFormatter('zh_CN', NumberFormatter::SPELLOUT))->format(123));→ 返回false或空串 - 若硬要中文读法,得自己写映射逻辑(个/十/百/千/万/亿)或引入第三方库,
NumberFormatter在这里帮不上忙
小数、负数、大数的 format 行为差异
NumberFormatter::SPELLOUT 对输入数字很敏感:小数会被转成“point zero five”,负号变成“minus”,超大整数可能截断或 fallback 到科学计数法拼写。
- 小数:输入
3.14→ 输出"three point one four"(不是 "three and fourteen hundredths") - 负数:输入
-42→ 输出"minus forty-two",无法去掉 "minus" - 大数:输入
1234567890(十位以上)在某些 ICU 版本中可能返回空或异常,建议先is_int($n) && $n 做范围校验 - locale 影响读法细节:例如
en_GB中100是 "one hundred",而en_US一样;但1234在英式英语中倾向 "one thousand two hundred and thirty-four",美式常省略 "and" —— 实际取决于底层 ICU 版本,不可强依赖
替代方案:不用 intl 扩展也能凑合用
如果服务器不能装 intl,又只要英文基础拼写(0–999),可以手写一个轻量函数,避开扩展依赖和 locale 陷阱。
立即学习“PHP免费学习笔记(深入)”;
- 核心思路:把数字拆成百位、十位、个位,查表映射(
['zero','one',..., 'ninety-nine']) - 注意边界:0 单独处理;11–19 是特殊词(eleven, twelve…);20 以上十位+个位要加连字符(
twenty-one) - 示例片段:
function numToWords(int $n): string {<br> if ($n === 0) return 'zero';<br> $ones = ['', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'];<br> $teens = ['eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen'];<br> $tens = ['', '', 'twenty', 'thirty', 'forty', 'fifty'];<br> // …(完整逻辑略)<br> return $result;<br>} - 缺点明显:不支持小数、负数、百万以上;但胜在可控、无依赖、调试方便
NumberFormatter 代码在 PHP 7.4 和 8.2 上可能输出不同结果,尤其是带空格、连字符或大小写。真要上生产,务必在目标环境实测几个关键数字,别只信本地开发机。











