數字金額轉中文繁體大寫

chuoke發表於2021-04-24

好吧,我居然在寫這個。

? 這是我的心情。

可以到這裡測試

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


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:人民幣壹億貳仟叄佰肆拾伍萬陸仟柒佰捌拾玖圓整

首發於:youlinkin.com/posts/14 ?

本作品採用《CC 協議》,轉載必須註明作者和本文連結
初出茅廬,一知半解,望有識之士多多賜教。

相關文章