- package com.itheima;
- import java.util.Scanner;
- public class Test10 {
- /*
- * 第10题:
- *
- * 金额转换,阿拉伯数字转换成中国传统形式。
- *
- * 例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整
- *
- * 分析:
- * 1.先定义字符数组,里边存储了中文数组.中文整数单位,中文小数单位
- * 2.键盘录入一个金额,并转换成数字字符串
- * 3.对字符串进行判断.如果超过了能转换的最大单位,提示金额过大
- * 4.数字字符分为两部分,整数和小数
- */
- private static final String[] chNum = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"}; //中文的数字
- private static final String[] iunit = {"元","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟","万","拾","佰","仟"}; //整数部分单位,最多十六位
- private static final String[] dunit = { "角", "分", "厘" }; //小数部分的单位
- public static void main(String[] args) {
- Scanner sc = new Scanner(System.in);
- System.out.println("请输入金额");
- String num = sc.nextLine();
- System.out.println(toChineseNum(num));
- }
- private static String toChineseNum(String num) {
- String integerLine; // 整数部分数字
- String decimalLine; // 小数部分数字
-
- //分别截取整数部分和小数部分
- if (num.indexOf(".") > 0) { //做判断,有小数点并且小数点在0索引后边
- integerLine = num.substring(0, num.indexOf(".")); //截取从第一个字符开始到小数点前一个字符,也就是整数部分
- decimalLine = num.substring(num.indexOf(".") + 1); //截取从小数点后一位开始到字符串尾,就是小数部分
- } else if (num.indexOf(".") == 0) { //判断如果该数字字符,第一位就是小数点
- integerLine = "";
- decimalLine = num.substring(1); //从小数点后一位开始截取小数部分
- } else {
- integerLine = num; //另外就是没有小数点,也就是只有整数部分
- decimalLine = "";
- }
-
- //去掉整数部分的首0
- if (!integerLine.equals("")) { //如果整数部分不为空串
- integerLine = Long.toString(Long.parseLong(integerLine)); //就去掉首位的0
- if (integerLine.equals("0")) { //如果整数部分为0
- integerLine = ""; //将整数部分置位空串
- }
- }
-
- //判断有没有超出转换的范围
- if (integerLine.length() > iunit.length) { //能处理最长的长度是十六位
- System.out.println("您输入的数字过大!");
- return num;
- }
-
- //将整数部分和小数部分都转换为int数组
- int[] integer = toArray(integerLine); //将整数部分转换为int数组
- int[] decimal = toArray(decimalLine); //将小数部分转换为int数组
-
- //获取整数部分的中文金额
- String getChineseInteger = getChineseInteger(integer);
-
- //获取小数部分的中文金额
- String getChineseDecimal = getChineseDecimal(decimal);
- return getChineseInteger + getChineseDecimal;
- }
-
- private static String getChineseDecimal(int[] decimal) {
- StringBuffer chineseDe = new StringBuffer("");
- for (int i = 0; i < decimal.length; i++) {
- if (i == 3){ //如果小数有三为,第三位舍弃
- break;
- }
- chineseDe.append(decimal[i] == 0 ? "" : (chNum[decimal[i]] + dunit[i])); //同整数部分一样添加单位和转换为中文数字
- }
- return chineseDe.toString();
- }
- private static String getChineseInteger(int[] integer) {
- StringBuffer chineseIn = new StringBuffer(""); //创建一个StringBuffer来存储转换后的金额,因为Stringbuffer有添加功能
- int len = integer.length; //获取传入金额数组的长度
- /*
- * 分析:
- * 1.遍历数组,对每一个数字进行判断,并且声明一个String变量用于存储单位
- * 2.如果说等于integer[i] == 0,就进行下一步判断
- * 3.考虑如果是关键的地方为0,例如万,十万等等,就要做相应判断,看需要加哪个单位
- * 4.如果不为0,就将对应的中文添加到String字符串
- * 5.最后将Stringbuffer转换为字符串返回
- */
- for (int i = 0; i < len; i++) {
- String s = "";
- if (integer[i] == 0) { //判断匹配上0才进入下层判断
- if ((len - i) == 13) //len - i == 13,说明这是在万(亿)单位,接着把万单位放在String变量中
- s = iunit[4];
- else if ((len - i) == 9) //同上,说明是在亿单位
- s = iunit[8];
- else if ((len - i) == 5/* && b*/) // 万(不必填)
- s = iunit[4];
- else if ((len - i) == 1) //如果出现关键单位,就用零代替,例如万,十万....
- s = iunit[0];
- if ((len - i) > 1 && integer[i + 1] != 0) //如果遇到0就补上一个零,不包含最后一位
- s += chNum[0];
- }
- chineseIn.append(integer[i] == 0 ? s : (chNum[integer[i]] + iunit[len - i - 1])); //如果匹配不是0,就用将中文字符添加到新定义的StringBuffer字符串
- }
- return chineseIn.toString(); //最后返回一个字符串,用到Stringbuffer中的toString()方法
- }
-
- private static int[] toArray(String s) {
- int[] arr = new int[s.length()]; //创建一个和传入的字符串等长度的数组
- for (int i = 0; i < arr.length; i++) { //遍历数组
- arr[i] = Integer.parseInt(s.substring(i, i + 1)); //从字符串中第一个字符开始往数组中添加
- }
- return arr;
- }
-
- }
复制代码
注释已经写在代码后了,希望大家能看懂我写的注释 |
|