java关于金额的工具类 java金额转换_java

做的是将整数做一个汉字表达,算上面这两个的结合。若是作业一则需要改静态数组即可;若是作业二则需要将字串分解判断,以小数点分割,分成两个部分做,然后拼接即可。

先贴代码,注释有解释

1、从后往前,8个8个分为一组,一组表示单位亿
2、由于我们是从后往前处理,而结果是从前往后读,因此根据栈的先进后出结构,每组保留结果入栈,保证最后一组虽然是先计算,但是最后被读出来。

public class myNum2Rmb {
    public static void main(String[] args) {
        TransferReader f = new TransferReader();
        String result = f.simpleTransfer("90000");
        System.out.println(result);
    }
}
class TransferReader{
    private static final String numArr[] = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
    private static final String unitsArr[] = {"","拾","佰","仟","萬","拾","佰","仟"};
    public String simpleTransfer(String moneyStr){
        //由于我们是从后往前先存后面的,所以需要一个先进后出的栈
        Stack<String> retStack = new Stack<>();
        //保存最终结果的StringBuilder
        StringBuilder ret = new StringBuilder("");
        //总字串的长度
        int length = moneyStr.length();
        //每组取8个 进行for循环 总共循环(length + 7) / 8 次  每次循环完 length - 8
        for (int i = 0; i < (length + 7) / 8; length -= 8){
            //从后往前截取字符串 每次8个  同时加上最后不足8的一组的下标判断
            String string = moneyStr.substring(length - 8 > 0 ? length - 8 : 0,length);
            //将每个分组转换为char数组
            char numChar[] = string.toCharArray();

            //测试用 System.out.println(string);

            //每一组的结果拼接
            StringBuilder tempRet = new StringBuilder("");
            //因为每组是以亿为分割 在组间需要加上一个亿为单位
            //如果当前不是最后一个分组,则先加上一个亿单位
            if (length - 8 > 0){
                tempRet.append("亿");
            }
            //对每组遍历
            for (int j = 0; j < numChar.length; j ++){
                //每次判断完操作完都进行continue 进行下一次循环 避免重复判断
                //如果开头就是0 那么就是零
                if (numChar[j] - 48 == 0  && j == 0){
                    tempRet.append("零");
                    continue;
                }
                //中间的零 填充零
                if ((numChar[j] - 48) == 0 && j != 0 && (numChar[j -1] - 48 != 0)){
                    tempRet.append("零");
                    continue;
                }
                //这个是0  前面还是0 连续的零不用重复读 所以跳过
                if ((numChar[j] - 48) == 0 && j != 0 && (numChar[j -1] - 48 == 0)){
                    continue;
                }
                //非 0 数字 进行数字和单位的拼接
                if (numChar[j] - 48 != 0){
                    // numChar[j] - 48 就是这个数字本身  numArr是该数字下标对应的汉字
                    // numChar.length - 1 - j 是对应单位的下标
                    tempRet.append(numArr[numChar[j] - 48]).append(unitsArr[numChar.length - 1 - j]);
                    continue;
                }
            }
            //根据上面的流程,如果是 90000 则会出现 九万零 所以如果一直到最后一个都是零的话 要去除最后一个“零”汉字
            if (numChar[numChar.length - 1] - 48 == 0){
                tempRet.deleteCharAt(tempRet.length() -1 );
            }
            System.out.println("这一组的tempR 为  " +  tempRet);
            //将一组结果入栈
            retStack.push(tempRet.toString());
        }
        // 以此出栈
        while (!retStack.empty()){
            ret.append(retStack.pop());
        }
        //返回最终结果
        return ret.toString();
    }
}
主要步骤

1、如何对数字单位拼接,由于单位不能通过算法来扩张,单位上的限制需要自己来编写,由此需要编写一个单位数组unitsArr[],还有一个中文数字数组numArr[] 2、其次就是对非结尾和结尾### ###的处理,对每个数字的判断逻辑。
3、对于每个分组的处理,最后拼接

end

这里没有对字符串合法性进行检查,比如“090”则会输出“零九十”;如果有需求,在输入前进行正则表达式检查即可。