You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键说明

  1. 拆分数字:因为你需要把小数部分当作一个独立整数来拼写(比如0.557对应557的拼写),所以通过计算分离出整数和三位小数对应的整数值。
  2. 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)。
  3. 边界情况处理:如果目标数字没有小数部分(比如10.000),可以加个判断,只输出整数部分的拼写,避免出现ten and zero这类多余内容:
$result = $decimalPart > 0 ? "{$spelledInteger} and {$spelledDecimal}" : $spelledInteger;

内容的提问来源于stack exchange,提问作者softya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 22:47:29