思路
- 先将角与元分隔成二个数组, A(万,千,百), B(角,分)数组
- 将A数组反转过来, 从小到大的顺序, 方便转换,装载到一个数组里
- 保证新的数组是从小到大的顺序.
- 对B数组进行压栈操作.使用array_unshift
- 然后将数组反转过来, 拼接成字符串.
代码实现
function ToChinaMoney($money) {
$money = round($money, 2);//只保留2位小数
//定义对应的中文表达数组
$china_number = ['零','壹','贰','叁','肆','伍','陆','柒','捌','玖'];
$china_units = ['角','分'];
$china_great = ['圆', '拾','佰','仟','万','拾','佰','仟','亿'];
list($max, $min) = explode('.', $money);//小数点分隔
$max_str = str_split($max);//将数字转换成数组,方便转换
$min_str = str_split($min);
$result = [];
//需要将大金额反转一下
foreach (array_reverse($max_str) as $key => $val) {
$result[] = $china_number[$val] . $china_great[$key];//转换对应的中文表达
}
foreach ($min_str as $key => $val) {
//每次添加天数组的头部,按从小到大的顺序
array_unshift($result, $china_number[$val] . $china_units[$key]);//转换对应的中文表达
}
$result = array_reverse($result);//将从小到大的反转成从大到小的顺序
return implode('', $result);//将数组转转换成字符串表达
}
测试
如果按照人的正常思维读取还有待优化程序.
$num = 31230.03;
echo ToChinaMoney($num);//叁万壹仟贰佰叁拾零圆零角叁分
$num = 10.3;
echo ToChinaMoney($num);//壹拾零圆叁角