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; } }
题目来源:牛客网
浙公网安备 33010602011771号