将一个浮点数转化为人民币大写字符串

package com.itwang;

import java.util.Arrays;

/**
 * 浮点数转为人民币
 */
public class NumberConventor {
    private String[] hanArr = {"零", "壹", "贰", "弎", "肆", "伍", "陆", "柒", "捌", "玖"};
    private String[] unitArr = {"分","角","十", "百", "千","万","亿"};
    /**
     * 把一个浮点数分解成整数部分和小数部分
     *
     * @param num
     * @return
     */
    private String[] divide(double num) {
        //将一个浮点数强制转换为long型,即得到它的整数部分
        long zheng = (long) num;
        //浮点数减去整数得到小数部分,小数部分乘以100后再取整得到2为小数
        long xiaoshu = Math.round((num - zheng) * 100);
        return new String[]{zheng + "", String.valueOf(xiaoshu)};
    }

    /**
     * 将后面的两位小数转化为汉字
     * @return
     */
    private String douleToString(String numStr){
        String result = "";
        int numLen = numStr.length();
        if (numStr.charAt(0) == '0' && numLen == 1){
            return "";
        }
        for (int i = 0;i < numLen;i++){
            int num = numStr.charAt(i) - 48;
            result += hanArr[num] + unitArr[1 - i];
        }
        return result;
    }
    /**
     * 把一个四位的数变成汉字字符串
     */
    private String toHanStr(String numStr) {
        String result = "";//存放最终结果
        int numLen = numStr.length();
        //扫描数字串从第一个不为零的地方开始
        int j;
        for (j = 0; j < numLen; j++) {
            if (numStr.charAt(j) != '0') {
                break;
            }
        }
        //四个全是零
        if (j == numLen) {
            return hanArr[0];
        }
        //不是四个全是零
        //从第一个不等于零的地方依次遍历数字字符串的每一位数字
        for (int i = j; i < numLen; i++) {
            //把char型数字换成int型数字,因为它们的ASCII码值恰好相差48
            //因此把char型数字减去48得到int型数字
            int num = numStr.charAt(i) - 48;
            //如果不是最后一位数字,而且数字不是零,需添加单位(千,百,十)
            if (num != 0 && i != numLen - 1) {
                result += hanArr[num] + unitArr[numLen - i];
            } else {
                //否则是最后一位则不添加单位,如果最后一位是零,连续两个零
                if (i == numLen - 1 && num == 0) {
                    return result;
                }
                //判断当前位置如果为零,判断下一个位置如果仍然为零直接跳过这两个零
                if(i != numLen - 1 && (i + 1) != numLen && (numStr.charAt(i + 1) == '0')){
                    i++;
                }
                else {
                    result += hanArr[num];
                }
            }
        }
        return result;
    }

    /**
     * 从四位数字串扩展到12位
     * @param numStr
     */
    private String toRBM(double inputNum){
        String numStr = divide(inputNum)[0];
        String numStr2 = divide(inputNum)[1];
        //换算整数部分
        int numLen = numStr.length();
        int entirePart = numLen / 4;
        int yuPart = numLen % 4;
        String result = "";
        //四位数字或四位数字之内
        if (numLen <= 4){
            result += toHanStr(numStr);
        }
        if (numLen > 4 && numLen <= 8){
            //获取最高位的4位数字串
            String gaowei = numStr.substring(0,numLen - 4);
            //获取最低位的4位数字串
            String disiwei = numStr.substring(numLen - 4);
            result += toHanStr(gaowei) + unitArr[5];
            result += toHanStr(disiwei);
        }
        if (numLen > 8 && numLen <= 12){
            //获取最高位的4位数字串
            String gaowei = numStr.substring(0, numLen - 8);
            //获取中间位的4位数字串
            String midlewei = numStr.substring(numLen - 8, numLen - 4);
            //获取最低位的4位数字串
            String disiwei = numStr.substring(numLen - 4);
            result += toHanStr(gaowei) + unitArr[6];
            result += toHanStr(midlewei) + unitArr[5];
            result += toHanStr(disiwei);
        }
        if (numLen > 12){
            return "输入的长度有误!";
        }
        //换算小数部分
        result += douleToString(numStr2);
        return result;
    }
    public static void main(String[] args) {
        NumberConventor numberConventor = new NumberConventor();
        //numberConventor.divide(2346844.123)[0]
        double inputNum = 123456789354.123;
        System.out.println(numberConventor.toRBM(inputNum));
    }
}

运行结果:

原文地址:https://www.cnblogs.com/ya-qiang/p/9438661.html