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

PHP 數字轉中文大寫:支援金額格式與萬億級大數字

     編輯:PHP 綜合知識

阿拉伯數字轉漢字大寫:兩種演算法完整實作

財務系統、合同列印、發票生成常需將數字轉為中文大寫(壹貳參肆...)。本文提供兩個函式:基礎版支援至千億整數轉換、進階版支援小數金額格式(元/角/分)、繁簡體切換。

方法一:基礎整數轉換(支援至千億)

function numToWord($num) {
    $chiNum = array('零', '一', '二', '三', '四', '五', '六', '七', '八', '九');
    $chiUni = array('', '十', '百', '千', '萬', '億', '十', '百', '千');
    $chiStr = '';
    $num_str = (string)$num;
    $count = strlen($num_str);
    $last_flag = true; $zero_flag = true; $index = 0;

    if ($count == 2) {  // 兩位數特殊處理:十二 不說 一十二
        $temp = $num_str[0];
        $chiStr = ($temp == 1) ? $chiUni[1] : $chiNum[$temp] . $chiUni[1];
        $temp = $num_str[1];
        $chiStr .= ($temp == 0) ? '' : $chiNum[$temp];
    } elseif ($count > 2) {
        for ($i = $count - 1; $i >= 0; $i--) {
            $temp = $num_str[$i];
            if ($temp == 0) {
                if (!$zero_flag && !$last_flag) {
                    $chiStr = $chiNum[$temp] . $chiStr;
                    $last_flag = true;
                }
            } else {
                $chiStr = $chiNum[$temp] . $chiUni[$index % 9] . $chiStr;
                $zero_flag = false;
                $last_flag = false;
            }
            $index++;
        }
    } else {
        $chiStr = $chiNum[$num_str[0]];
    }
    return $chiStr;
}

echo numToWord(150);        // 一百五十
echo numToWord(1000200);    // 一百萬零二百

方法二:進階金額格式轉換(推薦生產使用)

function number2chinese($num, $mode = true, $sim = true) {
    if (!is_numeric($num)) return '含有非數字非小數點字符!';

    $char = $sim ? array('零','一','二','三','四','五','六','七','八','九')
                 : array('零','壹','貳','參','肆','伍','陸','柒','捌','玖');
    $unit = $sim ? array('','十','百','千','','萬','億','兆')
                 : array('','拾','佰','仟','','萬','億','兆');
    $retval = $mode ? '元' : '點';

    // 小數部分處理
    if (strpos($num, '.') !== false) {
        list($num, $dec) = explode('.', $num);
        $dec = strval(round($dec, 2));  // 取小數點後兩位
        if ($mode) {
            $retval .= "{$char[$dec[0]]}角{$char[$dec[1]]}分";
        } else {
            for ($i = 0, $c = strlen($dec); $i < $c; $i++) {
                $retval .= $char[$dec[$i]];
            }
        }
    }

    // 整數部分處理(反轉字串由低位向高位處理)
    $str = $mode ? strrev(intval($num)) : strrev($num);
    for ($i = 0, $c = strlen($str); $i < $c; $i++) {
        $out[$i] = $char[$str[$i]];
        if ($mode) {
            $out[$i] .= ($str[$i] != '0') ? $unit[$i % 4] : '';
            // 連續兩個零只保留一個
            if ($i > 1 && $str[$i] + $str[$i-1] == 0) $out[$i] = '';
            // 萬/億位單位
            if ($i % 4 == 0) $out[$i] .= $unit[4 + floor($i/4)];
        }
    }
    return join('', array_reverse($out)) . $retval;
}

// 測試範例
$num = '0123648867.789';
echo '普通:', number2chinese($num, false), '<br>';     // 零一二三六四八八六七點七八九
echo '金額(簡體):', number2chinese($num, true), '<br>';   // 一億二千三百六十四萬八千八百六十七元七角八分
echo '金額(繁體):', number2chinese($num, true, false);      // 壹億貳仟參佰陸拾肆萬捌仟捌佰陸拾柒元柒角捌分

關鍵邏輯解析

  1. 分段處理:整數部份按 4 位一組(個/萬/億/兆),小數部份按角分固定兩位
  2. 零的處理:連續零只讀一個「零」;段末尾零不讀;整數部份反轉後由低位向高位判斷
  3. 單位陣列:`$unit[0-3]` 為個十百千,`$unit[4+]` 為萬億兆
  4. 繁簡切換:`$sim` 參數控制字符與單位陣列

應用場景與擴展

  • 財務報表自動生成中文金額
  • 合同/發票列印防竄改
  • 語音播報系統數字轉語音前置處理
  • 擴展:支援負數、科學記號、更大單位(京、垓)

進階版 `number2chinese()` 功能完整、邏輯嚴謹,可直接用於正式財務系統;基礎版適合簡單整數顯示需求。

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