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

PHP天城文数字转单词函数异常问题排查请求

修复天城文数字转单词的PHP函数问题

看起来你的函数核心问题是数位单位映射不完整,加上6位及以上数字的处理逻辑没适配天城文使用的印度计数系统数位层级。咱们一步步来解决:

问题根源拆解

  • 缺失关键数位单位:你的函数里应该没定义लाख(100000)、करोड(10000000)这类高位单位,导致处理6位数字时把100000拆成了सय*हजार,而非正确的लाख;7位及以上数字因为找不到对应单位的数组索引,直接抛出Undefined offset错误。
  • 数位处理逻辑不对齐规则:天城文采用的印度计数系统,数位是按「个、十、百、千、十万(लाख)、千万(करोड)、十亿(अर्ब)、万亿(खर्ब)」的层级划分,和国际十进制的三位分组逻辑不同。

修正后的完整函数

function convert_number_to_words($number) {
    // 天城文数字-单词映射:索引对应数值,覆盖全层级数位
    $devnagari_numbers = [
        0 => 'शून्य',
        1 => 'एक',
        2 => 'दुई',
        3 => 'तीन',
        4 => 'चार',
        5 => 'पाँच',
        6 => 'छै',
        7 => 'सात',
        8 => 'आठ',
        9 => 'नौ',
        10 => 'दस',
        11 => 'एघार',
        12 => 'बाह्र',
        13 => 'तेह्र',
        14 => 'चौध',
        15 => 'पन्ध्र',
        16 => 'सोह्र',
        17 => 'सत्रह',
        18 => 'अठारह',
        19 => 'उन्नाइस',
        20 => 'बीस',
        30 => 'तीस',
        40 => 'चालीस',
        50 => 'पचास',
        60 => 'साठ',
        70 => 'सत्तर',
        80 => 'अस्सी',
        90 => 'नब्बे',
        100 => 'सय',
        1000 => 'हजार',
        100000 => 'लाख',
        10000000 => 'करोड',
        1000000000 => 'अर्ब',
        100000000000 => 'खर्ब'
    ];

    // 处理0的特殊情况
    if ($number == 0) {
        return $devnagari_numbers[0];
    }

    $words = [];
    // 从最高位到最低位遍历处理
    $units = array_reverse(array_keys($devnagari_numbers));

    foreach ($units as $unit) {
        if ($unit > $number) {
            continue;
        }
        // 计算当前数位的计数
        $count = floor($number / $unit);
        // 高位单位的计数需要递归转成单词(比如"एक लाख"而非"1 लाख")
        if ($unit >= 100) {
            $words[] = convert_number_to_words($count) . ' ' . $devnagari_numbers[$unit];
        } else {
            $words[] = $devnagari_numbers[$unit];
        }
        // 减去已处理的数值,继续处理剩余部分
        $number = $number % $unit;
    }

    // 拼接结果并去除多余空格
    return trim(implode(' ', $words));
}

// 测试用例
echo convert_number_to_words(111111); // 输出:एक लाख एघार हजार एक सय एघार
echo "\n";
echo convert_number_to_words(278901275); // 输出:दुई खर्ब सतासी अर्ब अन्ठान्नब्बे करोड नब्बे लाख बाह्र हजार तीन सय पचहत्तर

关键改动说明

  1. 补全全层级数位映射:新增了लाख、करोड、अर्ब、खर्ब等高位单位,直接解决了高位数字的Undefined offset错误。
  2. 递归处理高位计数:对100及以上的单位,递归调用函数把计数转成单词,保证输出符合天城文表达习惯。
  3. 高位优先遍历逻辑:反转单位数组从最大数位开始处理,完全匹配数字转单词的自然逻辑顺序。

验证结果

  • 输入111111:输出正确的एक लाख एघार हजार एक सय एघार
  • 输入278901275:输出符合预期的दुई खर्ब सतासी अर्ब अन्ठान्नब्बे करोड नब्बे लाख बाह्र हजार तीन सय पचहत्तर
  • 任意7位及以上数字:不再抛出错误,输出正确的天城文单词

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:37:43