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

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) → first
  • numberToOrdinalWord(5) → fifth
  • numberToOrdinalWord(12) → twelfth
  • numberToOrdinalWord(21) → twenty-first
  • numberToOrdinalWord(45) → forty-fifth
  • numberToOrdinalWord(99) → ninety-ninth

注意避坑

  • 不要直接按数字个位判断序数后缀:11、12、13三个数不管个位是几,后缀固定为th,直接按个位判断会出现11st/12nd这种错误
  • 不规则序数词硬写映射表反而比各种动态拼接规则的维护成本低,不会出边界问题
  • Laravel项目里可以把这个函数放到app/helpers.php中,配置好自动加载就能全局调用

内容的提问来源于stack exchange,提问作者Samir Jung Karki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 05:51:30