这道题略坑,没有太直接的办法,加了注释,看你理解了
public class Test16 {
public static void main(String[] args) {
//long l = 101000001010L;
Scanner sc = new Scanner(System.in);
long l = Long.parseLong(sc.nextLine());
sc.close();
format(l);
}
public static void format(long l) {
ArrayList<Integer> list = new ArrayList<>(); //创建集合,接收传入数据拆分成若干个四位数
while(l > 0) {
int num = (int) (l % 10000);
list.add(num);
l /= 10000;
}
StringBuilder sb = new StringBuilder(); //用来存储最终转换的结果
for(int i = 0; i < list.size(); i++) {
StringBuilder sb1 = new StringBuilder(); //用来存储每个四位数转换的结果
if(list.get(i) != 0) { //当该四位数不为0时,调用change()方法将该数据转成对应的中文形式
int ge = list.get(i) % 10;
int shi = list.get(i) / 10 % 10;
int bai = list.get(i) / 10 / 10 % 10;
int qian = list.get(i) / 10 / 10 / 10 % 10;
change(qian, sb1 ,"千"); //将千位的数字转换为中文格式,并加上千
change(bai, sb1 ,"百"); //将百位的数字转换为中文格式,并加上百
change(shi, sb1 ,"十"); //将十位的数字转换为中文格式,并加上十
change(ge, sb1 , ""); //将个位的数字转换为中文格式
if(i == 1) {
sb1.append("万"); //如果是第二个四位数,则加上 万
}else if(i == 2) {
sb1.append("亿"); //如果是第三个四位数,则加上 亿
}
}else { //当四位数为0,如果第一个四位数和第三个四位数都不为零时,则加上 零,其他情况则为空
if(i == 1 && list.get(0) != 0 && list.get(2) != 0)
sb1.append("零");
}
String str = sb1.toString().replaceAll("(.)\\1+", "$1"); //将重复出现的零转换成一个零
str = str.startsWith("零") ? str.substring(1) : str; //如果字符串以零开头,则删除这个零
sb.insert(0, str); //将获得的字符串存储在字符串缓冲区的最前面
}
System.out.println(sb + "元");
}
//将数字转换成对应的中文形式
public static void change(int num, StringBuilder sb,String s) {
switch (num) {
case 9:
sb.append("九");
break;
case 8:
sb.append("八");
break;
case 7:
sb.append("七");
break;
case 6:
sb.append("六");
break;
case 5:
sb.append("五");
break;
case 4:
sb.append("四");
break;
case 3:
sb.append("三");
break;
case 2:
sb.append("二");
break;
case 1:
sb.append("一");
break;
case 0:
if(!"".equals(s)) //不为个位时添加 零
sb.append("零");
break;
}
if(num != 0) //当传入的数字不为0时,则再加上相应的 千 百 十
sb.append(s);
}
} |