Java机试题:人民币转换(需要使用BigDecimal)

描述

考试题目和要点:

1、中文大写金额数字前应标明“人民币”字样。中文大写金额数字应用壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿、元、角、分、零、整等字样填写。

2、中文大写金额数字到“元”为止的,在“元”之后,应写“整字,如532.00应写成“人民币伍佰叁拾贰元整”。在”角“和”分“后面不写”整字。

3、阿拉伯数字中间有“0”时,中文大写要写“零”字,阿拉伯数字中间连续有几个“0”时,中文大写金额中间只写一个“零”字,如6007.14,应写成“人民币陆仟零柒元壹角肆分“。
4、10应写作“拾”,100应写作“壹佰”。例如,1010.00应写作“人民币壹仟零拾元整”,110.00应写作“人民币壹佰拾元整”
5、十万以上的数字接千不用加“零”,例如,30105000.00应写作“人民币叁仟零拾万伍仟元整”
 
 
本题含有多组样例输入。

 

输入描述:

输入一个double数

输出描述:

输出人民币格式

import java.math.BigDecimal;
import java.util.Scanner;

/**
   *  需要用到BigDecimal,保留精度,除法、乘法、减法,比较大小操作
   *  思路:判断有亿、有万否, 然后整体转化为处理仟,以及小数点后,和对应的rmb大写数字转化,最有加上特殊情况的处理:如补零的情况。
 */
public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextBigDecimal()) {
            // double加减有精度丢失问题,用BigDecimal计算
            BigDecimal db = sc.nextBigDecimal();
            String rmb = "人民币";
            // 有亿(强转int获取整数部分,获取有多少亿) 舍去小数部分。
            // BigDecimal,有精度模式 ROUND_DOWN表示舍去保留位数之后的
            BigDecimal yiUnit = new BigDecimal(100000000);
            BigDecimal yi = db.divide(yiUnit, 0, BigDecimal.ROUND_DOWN);
            // BigDecimal比较大小,需要用compareTo
            if(yi.compareTo(new BigDecimal(0)) > 0) {
                String yiStr = String.valueOf(yi);
                rmb += getThousand(yiStr,false) + "亿";
                // 减掉亿的部分
                db = db.subtract(yi.multiply(yiUnit));
                
            }
            // 有万
            BigDecimal wanUnit = new BigDecimal(10000);
            BigDecimal wan = db.divide(wanUnit, 0, BigDecimal.ROUND_DOWN);
            // BigDecimal比较大小,需要用compareTo
            if(wan.compareTo(new BigDecimal(0)) > 0) {
                String wanStr = String.valueOf(wan);
                if(yi.compareTo(new BigDecimal(0)) > 0) {
                    rmb += getThousand(wanStr, true) + "万";
                } else {
                    rmb += getThousand(wanStr, false) + "万";
                }
                
                // 减掉万的部分
                db = db.subtract(wan.multiply(wanUnit));
            }
            // 仟佰拾以下
            BigDecimal qianUnit = new BigDecimal(1);
            // 除1是为了不改变大小获取仟位以内整数部分
            BigDecimal qian = db.divide(qianUnit, 0, BigDecimal.ROUND_DOWN);
            if(qian.compareTo(new BigDecimal(0)) > 0) {
                String qianStr = String.valueOf(qian);
                if(wan.compareTo(new BigDecimal(0)) > 0) {
                    rmb += getThousand(qianStr,true) + "元";
                } else {
                    rmb += getThousand(qianStr,false) + "元";
                }
                // 减掉剩下的整数部分
                db = db.subtract(qian);
            }
            if(db.compareTo(new BigDecimal(0)) == 0) {
                rmb += "整";
            } else {
                rmb += getCents(String.valueOf(db));
            }
            System.out.println(rmb);
        }
        
    }
    
    // 获取仟佰拾的rmb表达,addZero是否需要补零
    public static String getThousand(String str, Boolean addZero) {
        String ret = "";
        // 是否需要补零
        if(str.length() < 4 && addZero) {
            ret += "零";
        }
        for (int i = 0; i < str.length(); i++) {
            if(str.length() - i == 4) {
                ret += getRMBNum(str.charAt(i)) + "仟";
            }
            if(str.length() - i == 3) {
                // 判断零
                if(str.charAt(i) != '0') {
                    ret += getRMBNum(str.charAt(i)) + "佰";
                } else if(str.charAt(i+1) != '0') {
                    ret += getRMBNum(str.charAt(i));
                }
            }
            if(str.length() - i == 2) {
                // 判断零/壹
                if(str.charAt(i) == '1'){
                    ret += "拾";
                }else if(str.charAt(i) != '0') {
                    ret += getRMBNum(str.charAt(i)) + "拾";
                } else if(str.charAt(i+1) != '0') {
                    ret += getRMBNum(str.charAt(i));
                }
            }
            if(str.length() - i == 1) {
                // 判断零
                if(str.charAt(i) != '0') {
                    ret += getRMBNum(str.charAt(i));
                }
            }
        }
        return ret;
    }
    
    // 获取角分的rmb表达
    public static String getCents(String spotNum) {
        String ret = "";
        // .也是特殊字符需要转译
        String[] strArr = spotNum.split("\\.");
        String str = strArr[1];
        for (int i = 0; i < str.length(); i++) {
            if(str.length() - i == 2) {
                // 判断零
                if(str.charAt(i) != '0') {
                    ret += getRMBNum(str.charAt(i)) + "角";
                }
            }
            if(str.length() - i == 1) {
                // 判断零
                if(str.charAt(i) != '0') {
                    ret += getRMBNum(str.charAt(i)) + "分";
                }
            }
        }
        return ret;
    }
        
    // 获取人民币对应的数字
    public static String getRMBNum(char num) {
        String ret = "";
        switch (num) {
        case '0':
            ret = "零";
            break;
        case '1':
            ret = "壹";
            break;
        case '2':
            ret = "贰";
            break;
        case '3':
            ret = "叁";
            break;
        case '4':
            ret = "肆";
            break;
        case '5':
            ret = "伍";
            break;
        case '6':
            ret = "陆";
            break;
        case '7':
            ret = "柒";
            break;
        case '8':
            ret = "捌";
            break;
        case '9':
            ret = "玖";
            break;
        default:
            break;
        }
        return ret;
    }
}

题目来源:牛客网

posted @ 2022-01-15 12:29  对月当歌  阅读(359)  评论(0)    收藏  举报