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

PHP 中文數字轉阿拉伯數字:支援大寫、口語、混合文本與億萬單位

     編輯:PHP 綜合知識

功能特色

  • 支援 正體/簡體:一二三...、壹貳參...
  • 支援 單位字:十、百、千、萬、億、兆
  • 支援 口語習慣:兩(2)、仟/佰/拾(千/百/十)
  • 支援 混合文本:從句子中提取數字片段
  • 支援 阿拉伯數字混雜:26億 → 2600000000

完整實作程式碼

<?php
function checkNatInt(string $str): int {
    // 1. 字元對照表(含大寫、口語、異體字)
    $map = [
        '一'=>'1','二'=>'2','三'=>'3','四'=>'4','五'=>'5','六'=>'6','七'=>'7','八'=>'8','九'=>'9',
        '壹'=>'1','貳'=>'2','參'=>'3','肆'=>'4','伍'=>'5','陸'=>'6','柒'=>'7','捌'=>'8','玖'=>'9',
        '零'=>'0','兩'=>'2',
        '仟'=>'千','佰'=>'百','拾'=>'十',
        '萬萬'=>'億', // 古語:萬萬 = 億
    ];
    $str = strtr($str, $map);

    // 2. 擷取連續「數字+單位」片段(含阿拉伯數字)
    if (!preg_match('/([\d億萬千百十]+)/u', $str, $m)) return 0;
    $segment = $m[1];

    // 3. 遞迴解析:從大單位到小單位拆分
    $units = ['億'=>100000000, '萬'=>10000, '千'=>1000, '百'=>100, '十'=>10];
    $parse = function($s) use ($units, &$parse) {
        foreach ($units as $unit => $value) {
            if (strpos($s, $unit) !== false) {
                [$left, $right] = explode($unit, $s, 2);
                $left = $left === '' ? 1 : $parse($left); // 「十萬」左邊空 = 1
                $right = $right === '' ? 0 : $parse($right);
                return $left * $value + $right;
            }
        }
        return (int)$s; // 純數字
    };

    return $parse($segment);
}

// 輔助:從任意字串擷取第一段數字片段
function checkString($var, $pattern='', $default='') {
    if (!is_string($var)) $var = is_numeric($var) ? (string)$var : $default;
    return $pattern ? (preg_match($pattern, $var, $m) ? $m[1] : $default) : $var;
}
?>

測試案例與輸出

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

演算法解析

  1. 正規化:strtr 一次性替換所有中文數字字元為阿拉伯數字或標準單位字
  2. 擷取片段:正則 /([\d億萬千百十]+)/u 取出第一個連續「數字+單位」區塊
  3. 遞迴下降:從最大單位(億)開始,explode 分割左右,左遞迴 × 單位值 + 右遞迴
  4. 空左邊 = 1:處理「十萬、百億」等省略一的習慣

擴充方向

  • 小數支援:加入「點」字處理,遞迴解析小數部
  • 負數支援:偵測「負/減」前綴
  • 多段提取:preg_match_all 取出所有數字片段回傳陣列
  • 單位擴充:加入「兆(10^12)、京(10^16)、垓(10^20)」等大單位
  • 效能優化:將 $units 陣列提升為 static、編譯正則快取

限制說明

  • 不支援小數(如「三點一四」)
  • 不支援超過 PHP_INT_MAX(64位約 9.22e18)的數值
  • 僅提取第一個符合片段,複雜文本可能需 NLP 斷句後逐句處理

結語

這個 checkNatInt 函數以 30 行核心程式碼解決中文數字識別的 90% 場景,採用「字元正規化 → 正則擷取 → 遞迴下降解析」三階段管線,邏輯清晰、易於擴充。適合:中文金額錄入、語音轉文字後處理、爬蟲提取中文統計數字、表單驗證預處理等場景。

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