PHP解析BRL货币时NumberFormatter的parseCurrency返回false如何解决
问题原因
- 方法参数使用错误:
NumberFormatter::parseCurrency()的第二个参数是引用传值的输出参数,作用是方法执行完成后返回解析到的货币ISO代码,不是用来传入指定解析目标货币的,你提前给$currency赋值BRL对方法没有任何约束效果。 - 格式匹配坑:pt_BR区域的默认货币格式要求
R$和数值之间的空格是不换行空格(NBSP,Unicode U+00A0),如果你的输入字符串里是普通半角空格,也会触发解析失败返回false。
修复方案
方案1:适配原生格式解析,支持校验货币类型
public static function money($str) { $formatter = new \NumberFormatter('pt_BR', \NumberFormatter::CURRENCY); // 把输入里的普通空格替换为NBSP,适配pt_BR货币格式要求 $str = str_replace(' ', "\xc2\xa0", $str); $parsedCurrency = null; $value = $formatter->parseCurrency($str, $parsedCurrency); // 可选校验:只返回BRL类型的货币解析结果 if ($value !== false && $parsedCurrency === 'BRL') { return $value; } return false; }
方案2:简化解析逻辑,不严格校验货币前缀
public static function money($str) { $formatter = new \NumberFormatter('pt_BR', \NumberFormatter::DECIMAL); // 提前清除R$前缀和所有空格 $cleanStr = trim(str_replace(['R$', ' '], '', $str)); return $formatter->parse($cleanStr); }
内容的提问来源于stack exchange,提问作者João
相关产品推荐
相关产品推荐

