# PHP漢字如何轉阿拉伯數字
## 引言
在中文Web開發中,經常會遇到需要將漢字數字(如"一百二十三")轉換為阿拉伯數字(如"123")的需求。這種轉換在表單處理、數據清洗、自然語言處理等場景中非常實用。本文將深入探討PHP中實現漢字數字轉阿拉伯數字的多種方法,包括基礎算法、正則表達式處理、性能優化以及實際應用案例。
## 一、漢字數字體系基礎
### 1.1 中文數字基本單位
中文數字系統包含以下核心元素:
- 基本數字:零(0)、一(1)、二(2)、三(3)、四(4)、五(5)、六(6)、七(7)、八(8)、九(9)
- 數量級單位:十(10)、百(100)、千(1000)、萬(10000)、億(100000000)
- 特殊表達:兩(2)、廿(20)、卅(30)、卌(40)
### 1.2 中文數字組合規則
中文數字遵循"系數+單位"的組合方式,例如:
- "三百" = 3 × 100 = 300
- "五萬二千" = 5×10000 + 2×1000 = 52000
## 二、基礎轉換算法實現
### 2.1 簡單映射法(適用于1-99)
```php
function simpleChineseToNumber($chinese) {
$map = [
'零'=>0, '一'=>1, '二'=>2, '三'=>3, '四'=>4,
'五'=>5, '六'=>6, '七'=>7, '八'=>8, '九'=>9,
'十'=>10
];
if (strlen($chinese) == 1) {
return $map[$chinese] ?? 0;
}
if ($chinese == '十一') return 11;
if ($chinese == '十二') return 12;
// ... 其他特殊情況處理
}
function chineseToNumber($str) {
$unitMap = ['十'=>10, '百'=>100, '千'=>1000, '萬'=>10000, '億'=>100000000];
$numMap = ['零'=>0, '一'=>1, '二'=>2, '三'=>3, '四'=>4, '五'=>5,
'六'=>6, '七'=>7, '八'=>8, '九'=>9, '兩'=>2];
$result = 0;
$temp = 0;
$lastUnit = 1;
for ($i = mb_strlen($str)-1; $i >= 0; $i--) {
$char = mb_substr($str, $i, 1);
if (isset($numMap[$char])) {
$temp += $numMap[$char];
} elseif (isset($unitMap[$char])) {
$unit = $unitMap[$char];
if ($unit < $lastUnit) {
$temp = $temp * $unit;
} else {
$temp = $temp ?: 1;
$result += $temp * $unit;
$temp = 0;
}
$lastUnit = $unit;
}
}
return $result + $temp;
}
$numMap += [
'壹'=>1, '貳'=>2, '叁'=>3, '肆'=>4, '伍'=>5,
'陸'=>6, '柒'=>7, '捌'=>8, '玖'=>9, '拾'=>10,
'佰'=>100, '仟'=>1000, '萬'=>10000, '億'=>100000000
];
// 預處理去除所有"零"
$str = str_replace('零', '', $str);
// 或者在計算時特殊處理零的影響
function isValidChineseNumber($str) {
$pattern = '/^[零一二三四五六七八九十百千萬億兩壹貳叁肆伍陸柒捌玖拾佰仟萬億]+$/u';
return preg_match($pattern, $str);
}
$cache = new \Memcached();
$cacheKey = 'chinese_num_'.md5($chineseNumber);
if ($result = $cache->get($cacheKey)) {
return $result;
}
$result = chineseToNumber($chineseNumber);
$cache->set($cacheKey, $result, 3600);
return $result;
// 將字符串預先轉為數組
$chars = preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY);
foreach (array_reverse($chars) as $char) {
// 處理邏輯
}
// 用戶輸入"一百五十公斤"
if (preg_match('/([零-九兩十百千萬億]+)/u', $input, $matches)) {
$weight = chineseToNumber($matches[1]);
// 存儲為150
}
// 轉換"人民幣壹萬貳仟叁佰元整"
$amountStr = preg_replace('/[^零-九兩十百千萬億壹貳叁肆伍陸柒捌玖拾佰仟萬億]/u', '', $input);
$amount = chineseToNumber($amountStr);
中文數字超過PHP整型最大值時,建議使用BCMath擴展:
bcadd($largeNumber1, $largeNumber2);
function numberToChinese($num) {
// 實現邏輯
}
日文、韓文等東亞數字系統的轉換原理類似,可擴展支持
漢字數字到阿拉伯數字的轉換是中文Web開發中的常見需求。通過本文介紹的方法,開發者可以構建健壯的轉換系統。關鍵點在于理解中文數字的組成規則,處理好各種邊界情況,并根據實際場景選擇性能最優的解決方案。
附錄:完整工具類實現
class ChineseNumberConverter {
private static $numMap = [
'零'=>0, '一'=>1, '二'=>2, '三'=>3, '四'=>4,
'五'=>5, '六'=>6, '七'=>7, '八'=>8, '九'=>9,
'兩'=>2, '壹'=>1, '貳'=>2, '叁'=>3, '肆'=>4,
'伍'=>5, '陸'=>6, '柒'=>7, '捌'=>8, '玖'=>9
];
private static $unitMap = [
'十'=>10, '百'=>100, '千'=>1000,
'萬'=>10000, '億'=>100000000,
'拾'=>10, '佰'=>100, '仟'=>1000,
'萬'=>10000, '億'=>100000000
];
public static function toNumber($str) {
// 完整實現
}
public static function validate($str) {
// 驗證實現
}
}
參考文獻 1. 《中文信息處理》- 清華大學出版社 2. PHP官方多字節字符串處理文檔 3. Unicode中日韓數字標準 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。