Laravel中PHP NumberFormatter SPELLOUT格式自定义方法求助
解决Laravel中NumberFormatter数字转指定拼写格式的问题
要实现把10.557转换为ten and five hundred and fifty-seven(注:你的示例里小数部分写的是“five hundred and seventy five”,应该是笔误,实际557的正确拼写是前者)这类格式,核心思路是拆分数字的整数和小数部分,分别拼写后再拼接,因为默认的SPELLOUT规则不会自动按你想要的“整数+and+小数整数拼写”格式输出。
具体实现代码
在Laravel的Blade模板里可以这样写:
@php $targetNumber = round(10.557, 3); // 拆分整数部分 $integerPart = (int)floor($targetNumber); // 拆分三位小数部分(乘以1000后取整,确保是整数) $decimalPart = (int)round(($targetNumber - $integerPart) * 1000); // 初始化NumberFormatter,使用当前应用locale $formatter = new \NumberFormatter(Lang::locale(), \NumberFormatter::SPELLOUT); // 分别拼写整数和小数部分 $spelledInteger = $formatter->format($integerPart); $spelledDecimal = $formatter->format($decimalPart); // 拼接成目标格式 $result = "{$spelledInteger} and {$spelledDecimal}"; echo $result; @endphp
关键说明
- 拆分数字:因为你需要把小数部分当作一个独立整数来拼写(比如
0.557对应557的拼写),所以通过计算分离出整数和三位小数对应的整数值。 - Locale的影响:如果想要拼写中出现
and(比如five hundred and fifty-seven),需要确保你的应用locale设置为en_GB(英式英语);如果是en_US(美式英语),默认拼写会是five hundred fifty-seven(没有中间的and)。你可以通过config/app.php里的locale配置项调整,或者在代码里直接指定,比如new \NumberFormatter('en_GB', \NumberFormatter::SPELLOUT)。 - 边界情况处理:如果目标数字没有小数部分(比如
10.000),可以加个判断,只输出整数部分的拼写,避免出现ten and zero这类多余内容:
$result = $decimalPart > 0 ? "{$spelledInteger} and {$spelledDecimal}" : $spelledInteger;
内容的提问来源于stack exchange,提问作者softya
相关产品推荐
相关产品推荐

