标签:false 数字 no 大写 zero num str pass 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函数(反转多字节字符串),之前文章有
执行结果:
标签:false,数字,no,大写,zero,num,str,pass,PHP 来源: https://blog.csdn.net/m0_37711659/article/details/121283458
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。