PHP NumberFormatter生成不可断空格:替换格式化货币中的
解决PHP格式化货币后不可断空格导致的布局问题
我懂你的困扰——用numfmt_format_currency生成的法语欧元格式里,数字和欧元符号之间的空格是Unicode非断空格(U+00A0),而不是你尝试替换的HTML实体 ,这就是为什么str_replace(' ', " ", $datavalue)完全没用的原因。
直接有效的解决方案
你需要直接针对Unicode非断空格进行替换,有两种常用写法:
方法1:使用Unicode转义序列
$format = numfmt_create( 'fr_FR', NumberFormatter::CURRENCY); $datavalue = numfmt_format_currency($format, $data['value'], 'EUR'); // 替换Unicode非断空格为普通空格 $datavalue = str_replace("\u{00A0}", " ", $datavalue);
方法2:使用chr(160)(对应U+00A0的ASCII码值)
$format = numfmt_create( 'fr_FR', NumberFormatter::CURRENCY); $datavalue = numfmt_format_currency($format, $data['value'], 'EUR'); // 用chr(160)匹配非断空格 $datavalue = str_replace(chr(160), " ", $datavalue);
为什么之前的替换无效?
numfmt_format_currency返回的原始字符串里是原生的Unicode非断空格字符,而不是HTML编码后的 实体。你之前替换的是字符串" ",自然找不到匹配项,所以完全不起作用。
如果之后需要把这个值输出到HTML,替换成普通空格后就不会再有布局问题了;要是你想保留非断空格的语义但解决布局问题,也可以尝试用CSS的white-space: normal来处理,但直接替换成普通空格是最简单直接的方案。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

