PHP實現數位金額輕鬆轉成中文繁體大寫(實際測試)

2021-09-25 19:00:16

數位金額轉中文繁體大寫

好吧,我居然在寫這個。

可以到這裡測試。(https://sandbox.onlinephpfunctions.com/code/0cc068d3c89904e55d8aa9e55fdfa45eaab70c37)

數位金額轉中文繁體大寫:

if (!function_exists('rmb_capital')) {
    /**
     * 金額轉中文大寫
     *
     * @param  mixed  $amount
     * @return string
     */
    function rmb_capital($amount)
    {
        $capitalNumbers = [
            '零', '壹', '貳', '叄', '肆', '伍', '陸', '柒', '捌', '玖',
        ];

        $integerUnits = ['', '拾', '佰', '仟',];

        $placeUnits = ['', '萬', '億', '兆',];

        $decimalUnits = ['角', '分', '釐', '毫',];

        $result = [];

        $arr = explode('.', $amount);

        $integer = trim($arr[0] ?? '', '-');
        $decimal = $arr[1] ?? '';

        if (!((int) $decimal)) {
            $decimal = '';
        }

        // 轉換整數部分
        // 從個位開始

        $integerNumbers = $integer ? array_reverse(str_split($integer)) : [];

        $last = null;
        foreach (array_chunk($integerNumbers, 4) as $chunkKey => $chunk) {
            if (!((int) implode('', $chunk))) {
                // 全是 0 則直接跳過
                continue;
            }

            array_unshift($result, $placeUnits[$chunkKey]);

            foreach ($chunk as $key => $number) {
                // 去除重複 零,以及第一位的 零,類似:1002、110
                if (!$number && (!$last || $key === 0)) {
                    $last = $number;
                    continue;
                }
                $last = $number;

                // 類似 1022,中間的 0 是不需要 佰 的
                if ($number) {
                    array_unshift($result, $integerUnits[$key]);
                }

                array_unshift($result, $capitalNumbers[$number]);
            }
        }

        if (!$result) {
            array_push($result, $capitalNumbers[0]);
        }

        array_push($result, '圓');

        if (!$decimal) {
            array_push($result, '整');
        }

        // 轉換小數位
        $decimalNumbers = $decimal ? str_split($decimal) : [];
        foreach ($decimalNumbers as $key => $number) {
            array_push($result, $capitalNumbers[$number]);
            array_push($result, $decimalUnits[$key]);
        }

        if (strpos((string) $amount, '-') === 0) {
            array_unshift($result, '負');
        }

        return '人民幣' . implode('', $result);
    }
}

函數不對引數是否為數位值做驗證

簡單測試了一下:

:人民幣零圓整

dsfa:人民幣零圓整

0:人民幣零圓整

1:人民幣壹圓整

12:人民幣壹拾貳圓整

10:人民幣壹拾圓整

102:人民幣壹佰零貳圓整

110:人民幣壹佰壹拾圓整

1002:人民幣壹仟零貳圓整

1010:人民幣壹仟零壹拾圓整

1022:人民幣壹仟零貳拾貳圓整

100002:人民幣壹拾萬零貳圓整

1020345:人民幣壹佰零貳萬零叄佰肆拾伍圓整

100:人民幣壹佰圓整

10000:人民幣壹萬圓整

-22342.432:人民幣負貳萬貳仟叄佰肆拾貳圓肆角叄分貳釐

0.34:人民幣零圓叄角肆分

34.04:人民幣叄拾肆圓零角肆分

34532:人民幣叄萬肆仟伍佰叄拾貳圓整

123456789:人民幣壹億貳仟叄佰肆拾伍萬陸仟柒佰捌拾玖圓整

已改寫為開源擴充套件包: rmb-capital(https://packagist.org/packages/chuoke/rmb-capital)

推薦學習:《》

以上就是PHP實現數位金額輕鬆轉成中文繁體大寫(實際測試)的詳細內容,更多請關注TW511.COM其它相關文章!