PHP或Laravel中如何将数字转换为带序数后缀的英文单词?
PHP/Laravel 数字转英文序数词实现方案
直接给两种场景的可用方案,原生PHP和Laravel环境都能覆盖:
一、Laravel 快速实现
如果只是需要带序数后缀的数字格式(比如1st/2nd/3rd/5th),不用自己写逻辑,Laravel 内置的字符串门面就有现成方法:
use Illuminate\Support\Str; // 调用示例 Str::ordinal(1); // 输出 1st Str::ordinal(2); // 输出 2nd Str::ordinal(3); // 输出 3rd Str::ordinal(5); // 输出 5th Str::ordinal(11); // 输出 11th(自动处理11/12/13的特殊规则) Str::ordinal(21); // 输出 21st
如果需要返回完整的英文序数单词(比如输入1返回first、输入5返回fifth),Laravel 没有提供直接对应的方法,用下面的通用封装函数就行,原生PHP、Laravel 环境都能跑。
二、通用PHP封装函数(支持返回完整序数单词)
1-19的序数词属于不规则变化,直接用映射表处理是最稳妥的,比各种字符串替换、正则判断的坑少很多,性能也高:
/** * 将正整数转换为对应的英文序数单词 * @param int $num 要转换的正整数 * @return string * @throws InvalidArgumentException */ function numberToOrdinalWord(int $num): string { // 1-19 不规则序数词映射 $irregularMap = [ 1 => 'first', 2 => 'second', 3 => 'third', 4 => 'fourth', 5 => 'fifth', 6 => 'sixth', 7 => 'seventh', 8 => 'eighth', 9 => 'ninth', 10 => 'tenth', 11 => 'eleventh', 12 => 'twelfth', 13 => 'thirteenth', 14 => 'fourteenth', 15 => 'fifteenth', 16 => 'sixteenth', 17 => 'seventeenth', 18 => 'eighteenth', 19 => 'nineteenth', ]; // 整十序数词映射 $tensMap = [ 20 => 'twentieth', 30 => 'thirtieth', 40 => 'fortieth', 50 => 'fiftieth', 60 => 'sixtieth', 70 => 'seventieth', 80 => 'eightieth', 90 => 'ninetieth', ]; // 整十基数词映射(用来拼接非整十的两位数) $tensCardinalMap = [ 20 => 'twenty', 30 => 'thirty', 40 => 'forty', 50 => 'fifty', 60 => 'sixty', 70 => 'seventy', 80 => 'eighty', 90 => 'ninety', ]; if ($num < 1) { throw new \InvalidArgumentException('只支持转换正整数'); } // 1-19直接返回映射结果 if ($num <= 19) { return $irregularMap[$num]; } // 100以内整十数直接返回对应映射 if ($num < 100 && $num % 10 === 0) { return $tensMap[$num]; } // 处理20-99非整十数:十位基数词+连字符+个位序数词 if ($num < 100) { $tenVal = (int)floor($num / 10) * 10; $unitVal = $num % 10; return $tensCardinalMap[$tenVal] . '-' . $irregularMap[$unitVal]; } // 日常业务场景90%以上的需求只用到100以内的序数词,如果需要支持百位、千位及更大的数, // 按照“百位基数词+hundred+and+后面部分序数词”的规则扩展即可 }
调用示例
numberToOrdinalWord(1)→firstnumberToOrdinalWord(5)→fifthnumberToOrdinalWord(12)→twelfthnumberToOrdinalWord(21)→twenty-firstnumberToOrdinalWord(45)→forty-fifthnumberToOrdinalWord(99)→ninety-ninth
注意避坑
- 不要直接按数字个位判断序数后缀:11、12、13三个数不管个位是几,后缀固定为
th,直接按个位判断会出现11st/12nd这种错误 - 不规则序数词硬写映射表反而比各种动态拼接规则的维护成本低,不会出边界问题
- Laravel项目里可以把这个函数放到
app/helpers.php中,配置好自动加载就能全局调用
内容的提问来源于stack exchange,提问作者Samir Jung Karki
相关产品推荐
相关产品推荐

