money_format() 在 PHP 8.0 中被彻底移除,因其依赖的 C 库 strfmon() 存在跨平台兼容性差、线程不安全等问题;推荐使用 NumberFormatter::formatCurrency() 替代,需启用 intl 扩展。

PHP 7.3 升级到 8.0 后,money_format() 函数直接报错“Call to undefined function”,因为它在 PHP 8.0 中被**彻底移除**,不是弃用、不是警告,而是函数本身不存在了。
为什么不能继续用
该函数依赖 C 库 strfmon(),存在跨平台兼容问题(Windows 下不可用)、区域设置(LC_MONETARY)线程不安全、行为不一致等缺陷。PHP 官方自 7.4.0 起标记为弃用,8.0.0 正式删除。
推荐替代方案:NumberFormatter::formatCurrency()
这是官方明确推荐的现代化、国际化、可维护的替代方式,需启用 intl 扩展(大多数现代 PHP 环境已默认安装):
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 先确认扩展可用:
php -m | grep intl,若无输出,请安装(如 Ubuntu:sudo apt install php-intl) - 基础用法示例:
$fmt = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
echo $fmt->formatCurrency(1234.56, 'USD'); // 输出:$1,234.56 - 支持多语言和多币种:
new NumberFormatter('de_DE', NumberFormatter::CURRENCY)→1.234,56 €;new NumberFormatter('ja_JP', NumberFormatter::CURRENCY)→¥1,235 - 注意:
formatCurrency()第二个参数必须是标准三字母货币代码(如USD、EUR、JPY),不能传字符串如"$"
轻量级兜底方案:number_format() + 手动拼接
如果无法启用 intl 扩展,或项目只需简单格式(如固定 USD、无本地化需求),可用 number_format() 搭配符号处理:
- 基本美元格式:
$amount = 1234.56;
$formatted = '$' . number_format($amount, 2, '.', ','); // $1,234.56 - 需注意小数位数统一(避免
1000变成$1000.00而1000.5变成$1000.50)——number_format()的第二参数可强制保留两位 - 缺点明显:不支持自动货币符号位置切换(如欧元符号在后)、不处理千分位/小数点本地化差异、无法适配不同区域习惯
迁移时要检查的关键点
搜索全项目所有 money_format( 调用,并逐处替换。特别注意:
- 是否硬编码了 locale(如
setlocale(LC_MONETARY, 'zh_CN'))——新方案中 locale 已内置于NumberFormatter构造参数,无需全局设置 - 原格式字符串中的标记(如
%i、%n、^、!)全部失效,需按语义重写逻辑 - 原函数返回
NULL的情况(如非数值输入)现在会抛出异常,建议加is_numeric()或filter_var($val, FILTER_VALIDATE_FLOAT)校验
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










