首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 智能中文數字轉換:支援大寫、口語、混合格式的高效實現

     編輯:PHP 相關知識

功能展示

echo checkNatInt('九百六十萬');                    // 9600000
echo checkNatInt('壹億柒仟萬零捌佰肆拾');          // 170000840
echo checkNatInt('學好PHP拿百萬年薪');              // 1000000
echo checkNatInt('今年春運發送人次達26億');         // 2600000000
echo checkNatInt('兩只小蜜蜂');                    // 2
echo checkNatInt('萬萬沒想到');                    // 100000000

限制說明

  1. 不支援小數
  2. 不支援超過 PHP_INT_MAX 的數值

核心實現代碼

<?php
// 校驗整數,失敗返回 $default
function checkInt($var, $default = 0) {
    return is_numeric($var) ? intval($var, (strncasecmp($var, '0x', 2) == 0 || strncasecmp($var, '-0x', 3) == 0) ? 16 : 10) : $default;
}

// 校驗字串,$check 為正則表達式
function checkString($var, $check = '', $default = '') {
    if (!is_string($var)) {
        if (is_numeric($var)) { $var = (string)$var; }
        else { return $default; }
    }
    if ($check) {
        return (preg_match($check, $var, $ret) ? $ret[1] : $default);
    }
    return $var;
}

/**
 * 校驗 KV JSON 格式
 * 期望數據結構:{id:1, 'type':'single_text', 'required':true, 'desc':'this is a text'}
 * $desc 範例:
 * array(
 *   array('id', 'Int'),
 *   array('type', 'string', PATTERN_NORMAL_STRING),
 *   array('required', 'Bool', false),
 *   array('desc', 'string', PATTERN_NORMAL_STRING),
 * )
 */
function checkKvJson($var, $desc = array()) {
    if (is_string($var)) { $var = json_decode($var, true); }
    if (!$var || !is_array($var)) { return array(); }
    
    if ($desc) foreach ($desc as $d) {
        if (!isset($var[$d[0]])) { return array(); }
        $ps = array_slice($d, 2);
        array_unshift($ps, $var[$d[0]]);
        $var[$d[0]] = call_user_func_array('check'.$d[1], $ps);
        if ($var[$d[0]] === false && strcasecmp($d[1], 'Bool')) { return array(); }
    }
    return $var;
}

// 主函數:中文轉數字
function checkNatInt($str) {
    $map = array(
        '一'=>'1','二'=>'2','三'=>'3','四'=>'4','五'=>'5','六'=>'6','七'=>'7','八'=>'8','九'=>'9',
        '壹'=>'1','貳'=>'2','三'=>'3','肆'=>'4','伍'=>'5','陸'=>'6','柒'=>'7','捌'=>'8','玖'=>'9',
        '零'=>'0','兩'=>'2',
        '仟'=>'千','佰'=>'百','拾'=>'十',
        '萬萬'=>'億',
    );
    $str = str_replace(array_keys($map), array_values($map), $str);
    $str = checkString($str, '/([\d億萬千百十]+)/u');
    
    $func_c2i = function ($str, $plus = false) use (&$func_c2i) {
        if (false === $plus) {
            $plus = array('億'=>100000000,'萬'=>10000,'千'=>1000,'百'=>100,'十'=>10);
        }
        $i = 0;
        if ($plus) foreach ($plus as $k => $v) {
            $i++;
            if (strpos($str, $k) !== false) {
                $ex = explode($k, $str, 2);
                $new_plus = array_slice($plus, $i, null, true);
                $l = $func_c2i($ex[0], $new_plus);
                $r = $func_c2i($ex[1], $new_plus);
                if ($l == 0) $l = 1; // 處理「十萬」省略一的情況
                return $l * $v + $r;
            }
        }
        return (int)$str;
    };
    return $func_c2i($str);
}

算法核心:遞歸下降解析

按單位從大到小(億→萬→千→百→十)遞歸拆解:

  1. 尋找當前最大單位字符
  2. 以該字符分割字串為左右兩部分
  3. 遞歸解析左部分(係數)與右部分(餘數)
  4. 結果 = 左部分 × 單位值 + 右部分
  5. 若左部分為 0,視為 1(處理「十萬」等省略一的習慣用法)

擴展性設計亮點

  • checkKvJson() 實現聲明式數據驗證:定義 schema 自動映射驗證函數
  • 統一的 check* 函數族支援鏈式調用
  • 正則預提取減少無效字符干擾
  • 映射表易於擴展新的中文數字表達

應用場景

  • 自然語言處理(NLP)中的數字實體識別
  • 語音識別結果後處理
  • 用戶輸入的自然語言訂單解析
  • 客服機器人意圖理解
  • 文本挖掘與數據清洗

代碼來源:UCT PHP 微信開發框架,結構清晰、邏輯嚴密,是 PHP 中文數字處理的優秀參考實現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved