中文金额大写转换处理

    /** 金额单位(整数) */
    private final static String[] PRCE_UNIT = new String[] {"仟", "佰", "拾", "兆", "仟", "佰", "拾", "亿", "仟", "佰", "拾", "万", "仟", "佰", "拾", "圆"};

    /** 大写数字 */
    private final static Map<String, String> UPER_NMBR = new HashMap<String, String>();
    /** 大写数字初始化 */
    static {
        // 零
        UPER_NMBR.put("0", "零");
        // 壹
        UPER_NMBR.put("1", "壹");
        // 贰
        UPER_NMBR.put("2", "贰");
        // 叁
        UPER_NMBR.put("3", "叁");
        // 肆
        UPER_NMBR.put("4", "肆");
        // 伍
        UPER_NMBR.put("5", "伍");
        // 陆
        UPER_NMBR.put("6", "陆");
        // 柒
        UPER_NMBR.put("7", "柒");
        // 捌
        UPER_NMBR.put("8", "捌");
        // 玖
        UPER_NMBR.put("9", "玖");
    }


    /**
     * 中文金额大写转换处理。<br/>
     *
     * @param nmbr 被转换金额
     * @param unitLgth 单位长度<br/>(2:拾;3:佰;4:仟:5:万;6:拾万;7:佰万;8:仟万:9:亿;10:拾亿;11:佰亿;12:仟亿:13:兆; 以外:圆)
     * @param String - 大写金额
     */
    public final static String fmatPrceUperCN(String nmbr, int unitLgth) {

        // 不截取小数位数据转换
        final String chgeNmbr = LCSUtil.paseBigDcml(nmbr, "0", -1).toString();

        // 圆金额单位标识
        final boolean yuanUnitFlag = (unitLgth < 2 || unitLgth > 13);

        // 整数、小数截取
        final String[] nmbrMatx = chgeNmbr.split("\\.");

        // 整数部分
        String befo = nmbrMatx[0];
        // 小数部分
        String aftr = null;
        // 小数部分存在判断
        if (nmbrMatx.length > 1) {

            // 存在时,初始化小数位
            aftr = nmbrMatx[1];
        }

        // 整合结果对象初始化
        final StringBuffer mony = new StringBuffer();

        // 金额
        String prce = null;
        // 单位
        String unit = null;

        // 整数部分金额存在判断
        if (!LCSUtil.isEmpty(befo)) {

            // 起始位置
            int begnIndx = PRCE_UNIT.length - befo.length();

            // 整数部分遍历
            for (int i = 0, l = befo.length(); i < l; i++, begnIndx++) {
    
                // 金额
                prce = befo.substring(i, i + 1);
                // 单位
                unit = PRCE_UNIT[begnIndx];
    
                // 是否数字零
                if ("0".equals(prce)) {
    
                    // 零时的特殊逻辑处理
                    if ("兆".equals(unit) || "亿".equals(unit) || "万".equals(unit) || "圆".equals(unit)) {
    
                        // 零结尾判断
                        if (mony.lastIndexOf("零") == (mony.length() - 1)) {
    
                            // 零时,剔除该字符
                            if (mony.length() > 0) {

                                // 部分金额存在时,剔除最后一个字符零
                                mony.replace(mony.length() - 1, mony.length(), "");
                            } else {
    
                                // 不存在时,即零圆
                                mony.append("零");
                            }
                        }

                        // 单位累计
                        mony.append(unit);
                    } else if (mony.lastIndexOf("零") != (mony.length() - 1)) {

                        // 非零结尾时,追加零字符
                        mony.append("零");
                    }
                } else {
    
                    // 上记以外时,正常金额单位累计
                    mony.append(UPER_NMBR.get(prce).concat(unit));
                }
            }
        }

        // 圆金额单位标识判断
        if (!yuanUnitFlag) {

            // 非圆金额单位时,圆单位结尾条件判断
            if (mony.lastIndexOf("圆") == (mony.length() - 1)) {

                // 剔除最后一个金额单位
                mony.replace(mony.length() - 1, mony.length(), "");
            }
        }

        // 圆金额单位标识判断
        if (yuanUnitFlag) {

            // 圆金额单位时,小数位存在判断
            if (LCSUtil.isEmpty(aftr) || aftr.startsWith("00") || "0".equals(aftr)) {

                // 无小数位或零结尾时,整数金额存在判断
                if (mony.length() > 0) {

                    // 存在时,整金额字符追加
                    mony.append("整");
                }
            } else {

                // 小数位
                if (aftr.length() > 1) {

                    // 分值是否为零判断
                    if ("0".equals(aftr.substring(1, 2))) {

                        // 为零时,即角单位值
                        mony.append(UPER_NMBR.get(aftr.substring(0, 1)).concat("角"));
                    } else if ("0".equals(aftr.substring(0, 1))) {

                        // 为零时,即分单位值
                        mony.append("零".concat(UPER_NMBR.get(aftr.substring(1, 2))).concat("分"));
                    } else {

                        // 角单位值
                        mony.append(UPER_NMBR.get(aftr.substring(0, 1)).concat("角"));
                        // 分单位值
                        mony.append(UPER_NMBR.get(aftr.substring(1, 2)).concat("分"));
                    }
                } else if (aftr.length() > 0) {

                    // 角单位值
                    mony.append(UPER_NMBR.get(aftr.substring(0, 1)).concat("角"));
                }
            }
        } else if (!LCSUtil.isEmpty(aftr)) {

            // 非圆金额单位,且存在小数位时,分隔符点设置
            mony.append("点");

            // 小数位信息转换
            for (int i = 0, l = aftr.length(); i < l; i++) {

                // 数字大写转换
                mony.append(UPER_NMBR.get(aftr.substring(i, i + 1)));
            }
        }

        // 圆金额单位标识判断
        if (!yuanUnitFlag) {

            // 结尾是否为零判断
            while ("零".equals(mony.substring(mony.length() - 1))) {

                // 剔除最后一个数字零处理
                mony.replace(mony.length() - 1, mony.length(), "");
            }
            // 剔除小数位后的零之后,判断是否仍存在小数位
            if ("点".equals(mony.substring(mony.length() - 1))) {

                // 无小数位时,剔除最后一个分隔符点处理
                mony.replace(mony.length() - 1, mony.length(), "");
            }

            // 非圆金额单位时,金额单位设置
            switch (unitLgth) {
            case 3: // 3:佰
                mony.append("佰圆");
                break;
            case 4: // 4:仟
                mony.append("仟圆");
                break;
            case 5: // 5:万
                mony.append("万圆");
                break;
            case 6: // 6:拾万
                mony.append("拾万圆");
                break;
            case 7: // 7:佰万
                mony.append("佰万圆");
                break;
            case 8: // 8:仟万
                mony.append("仟万圆");
                break;
            case 9: // 9:亿
                mony.append("亿圆");
                break;
            case 10: // 10:拾亿
                mony.append("拾亿圆");
                break;
            case 11: // 11:佰亿
                mony.append("佰亿圆");
                break;
            case 12: // 12:仟亿
                mony.append("仟亿圆");
                break;
            case 13: // 13:兆
                mony.append("兆圆");
                break;
            default: // 2:拾
                mony.append("拾圆");
                break;
            }

            // 整合结果后,判断是否仍存在小数位
            if (mony.indexOf("点") < 0) {

                // 无小数位时,整金额结果结尾
                mony.append("整");
            }
        }

//        // 调试日志
//        System.out.println("金额: ".concat(chgeNmbr).concat("\t大写:").concat(mony.toString()));

        // 大写金额返回
        return mony.toString();
    }

以上源码版权归 LvCreator 所有,仅供参考使用...

你可能感兴趣的:(大写金额)