数字转人民币大写,PHP实现

/**
 * 获取人民币数字大写
 * @param int|string $num
 * @return string
 */
function get_rmb(int|string $num): string
{
    $str = '';

    $a = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
    $b = ['分', '角', '元', '整'];
    $c = ['', '拾', '佰', '仟'];
    $d = ['万', '亿'];

    // 四舍五入 保留两位小数
    $num = sp_round($num, 2);

    // 反转字符串
    $num = strrev($num);

    // 小数
    if (($point = strpos($num, '.')) !== false) {
        if ($point == 2) {
            $str .= $b[0] . $a[$num[0]] . ($num[1] ? $b[1] : '') . $a[$num[1]]; // 角分
        } else {
            $str .= $b[1] . $a[$num[0]]; // 角
        }
        $num = substr($num, $point + 1);
    } else {
        $str .= $b[3]; // 整
    }

    $str .= $b[2]; // 元

    $is_pass = false; // 是否经过一位非零数字
    $no_zero = true; // 没有零
    $len = strlen($num); // 字符串长度

    // 第一位数字
    if ($num[0]) {
        $is_pass = true;
        $str .= $a[$num[0]];
    }

    // 第一位以后
    for ($i = 1; $i < $len; ++ $i) {

        // 处理万亿
        if (($mod = $i % 4) == 0) {
            $is_pass = false; // 是否经过一位非零数字
            $no_zero = true; // 没有零

            $div = intdiv($i, 4);
            $str .= str_repeat($d[1], intdiv($div, 2)); // 亿
            $str .= $div % 2 ? $d[0] : ''; // 万
        }

        if ($num[$i]) {
            $is_pass = true;
            $str .= $c[$mod] . $a[$num[$i]];
        } else {
            if ($is_pass && $no_zero) {
                $str .= $a[$num[$i]];
                $no_zero = false;
            }
        }
    }

    return mb_strrev($str); // 反转多字节字符串
}


v(get_rmb('1004560007807005.123456'));
v(get_rmb('123456789012304560.99956'));

注:依赖  sp_round函数(对长数字字符串四舍五入)mb_strrev函数(反转多字节字符串),之前文章有

执行结果:

数字转人民币大写,PHP实现




上一篇:思科数据中心CCIE稳定PASS


下一篇:Upload-labs 文件上传靶场通关攻略(上)