1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 财务金额转换:小写金额转换成大写算法

财务金额转换:小写金额转换成大写算法

时间:2020-03-18 20:00:37

相关推荐

财务金额转换:小写金额转换成大写算法

本方法思路,是将数字分成整数、小数两部分分别处理:

1、 整数部分按照4位一组进行分段,具体详见代码中的array_chunk操作

2、小数部分,为了简单,没有考虑更多小数精度,仅考虑到了“分”,实际可以参照整数部分的处理,更精细化

另外,受限于php语言默认的变量范围大小影响,当数值过大后,会造成小数部分被舍去,这个参照sprintf("%.2f",....)取浮点数的时候,改变其算法即可。 不过一般来说不会超过

其它溢出:若数字超过了stepInt的长度,会报错,但一般你也超过不了,数字最大长度支持到:10^(4 * 18), 大约72位数字长度。这个估计已经超出人的正常读写范围了。

if (! function_exists('num2rmb')) {/*** 数字转换成rmb大写形式* @param string|number $num* @return string*/function num2rmb($num){list($int, $float) = explode('.', sprintf("%.2f", $num));$intArr = array_chunk(str_split(strrev($int), 1), 4);$floatArr = str_split($float, 1);// 字典定义$stepInt = ['', '万','亿','兆','京','垓','秭','穰','沟','涧','正','载','极','恒河沙','阿僧祇','那由他','不可思议','无量大数'];//$stepFloat = ['角', '分', '厘', '毫', '丝', '忽', '微', '纤', '沙', '尘', '埃', '渺', '莫', '模糊', '逡巡', '须臾', '瞬息', '弹指', '刹那', '六德', '空虚', '清静'];$dict = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];// 返回变量$res = [];// 整数部分处理, 四个数字为一段,分段处理foreach ($intArr as $k => $spec) {// 长度不够强制长度转成一样$len = count($spec);if ($len < 4) array_push($spec, ...array_fill(0, 4 - $len, 0));list($n1, $n10, $n100, $n1000) = $spec; // 跳过为0的if ($n1000 + $n100 + $n10 + $n1 == 0) continue;$row = [];$row[] = ($n1000 == 0) ? '?' : $dict[$n1000] . '仟';$row[] = ($n100 == 0) ? '?' : $dict[$n100] . '佰';$row[] = ($n10 == 0) ? '?' : $dict[$n10] . '拾';$row[] = ($n1 == 0) ? '?' : $dict[$n1];// 最多可能四个数字都为0$s = str_replace(['?', '??', '???'], '零', trim(join($row), '?')) . $stepInt[$k];;if ($k > 0 && ($n1000 == 0)) {array_unshift($res, '零');}array_unshift($res, $s);}// 过滤个位数为0的情况if ($res[count($res) - 1] == '零') {array_pop($res);}array_push($res, '圆');// 小数部分处理list($jiao, $fen) = $floatArr;if ($jiao + $fen == 0) {array_push($res, '整');} else {if ($jiao == 0) {array_push($res, '零');array_push($res, $dict[$fen] . '分');} else {array_push($res, $dict[$jiao] . '角');array_push($res, $dict[$fen] . '分');}}return join($res);}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。