PHP中NumberFormatter生成的货币字符串为何与相同字面量不相等
问题原因分析
核心原因是两个字符串里的空格类型不一致:
- 你手写的
$expected中GBP和数字之间是普通ASCII空格(编码为0x20) NumberFormatter生成的$currency中对应位置的是不换行空格(NBSP,Unicode编码U+00A0,UTF-8下字节表现为0xC2A0)
这两种空格视觉上完全一致,但底层编码不同,所以松散相等==和严格相等===的判定结果都是不相等。
验证方法
你可以通过打印两个字符串的十六进制编码直接看到差异:
echo bin2hex($expected) . PHP_EOL; echo bin2hex($currency) . PHP_EOL;
输出结果里普通空格对应20,不换行空格对应c2a0,差异一目了然。
解决办法
- 方案一:把生成的货币字符串中的不换行空格替换为普通空格后再比较
$currency = str_replace("\xc2\xa0", " ", $currency); // 此时再做相等判定就会返回equals
- 方案二:不要手写预期值,直接用同规则的
NumberFormatter生成预期对比值,从根源避免特殊字符差异问题。
内容的提问来源于stack exchange,提问作者Chirag Kalani
相关产品推荐
相关产品推荐

