经典Java题目:输入一个数字,输出它的大写汉字(阿拉伯数字转汉字)

写在前面

无意间看到一个Java题目,觉得挺有意思,就拿出来和大家分享:

输入一个数字,输出它的大写汉字。

就像这样:
在这里插入图片描述
在这里插入图片描述

这算是一个有趣的题目了。但是早前我Java基础特别差就没能实现它。

当然,这次我也是在以前写的垃圾代码上做出的修改。

代码整体看起来会很乱。甚至有一些bug。
而且仅仅只能够转化整数,不能操作小数。
不过它也算是能够适应大多数情况的数字大小写转换了。

代码如下:

package demo;

import java.util.Scanner;

/**
 * 计数单位应包含整数部分和小数部分两大块,并按以下顺序排列:
 * 京、千兆、百兆、十兆、兆、千亿、百亿、十亿、亿、千万、百万、十万、万、
 * 千、百、十、个(一)、十分之一、百分之一、千分之一、……整数部分没有
 * 最大的计数单位,小数部分没有最小的计数单位。
 * @author Administrator
 *
 */
public class NumConvert {
	//这个方法用来得到一个数的位数,有几位?
	public static int  getDigitNumSum(int num){
		int divitor = 10;//它是一个我们需要用到的除数
		for(int i = 1;;i++){
			if(num/divitor<1){
				return i;
			}else{
				divitor*=10;
			}
		}
	}

	public int[][] getNumAndDigitArr(int number){
		int divitor = 10;
		int tem = number;
		int i =1;//记录循环趟数
		int n = getDigitNumSum(number);
		int[] numArr = new int [n];
		int[] digitArr = new int [n];
		int[][] numAndDigitArr = new int[2][n];
		while(tem>=1){
			//每一位的数
			int num = tem%divitor;
			//他在倒数第"+i+"位"
			numArr[i-1] = num;
			digitArr[i-1] = i;
			tem = tem/divitor;
			i++;
		}
		numAndDigitArr[0] = numArr;
		numAndDigitArr[1] = digitArr;
		return numAndDigitArr;
	}
	//写一个方法,完成一维数组的倒置
	private int[] inversion1(int[] array){
		int temp;
		for(int i=0;i<array.length/2;i++){
			temp = array[i];
			array[i] = array[array.length-i-1];
			array[array.length-i-1] = temp;
		}
		return array;//这里其实也不用返回,倒置的数组空间内容已经保存下来了
		//至于为什么会保存下来,有待深究!!!
	}
	//写一个方法,完成二维数组的倒置(前后元素颠倒)
	private void inversion2(int [][] array){
		for(int i=0;i<array.length;i++){
			inversion1(array[i]);
		}
	}
	//输出汉语数字
	public String outChineseNum(int num){
		switch (num) {
		case 0:
			return "零";
		case 1:
			return "壹";
		case 2:
			return "贰";
		case 3:
			return "叁";
		case 4:
			return "肆";
		case 5:
			return "伍";
		case 6:
			return "陆";
		case 7:
			return "柒";
		case 8:
			return "捌";
		case 9:
			return "玖";
		default:
			return "error";
		}
	}
	//输出大写数字的汉语位名称,它的极限到‘京’
	public String outChineseDigit(int digit){
		switch (digit) {
		case 0:
			return "";
		case 1:
			return "";
		case 2:
			return "十";
		case 3:
			return "百";
		case 4:
			return "千";
		case 5:
			return "万";
		case 6:
			return "十万";
		case 7:
			return "百万";
		case 8:
			return "千万";
		case 9:
			return "亿";
		case 10:
			return "十亿";
		case 11:
			return "百亿";
		case 12:
			return "千亿";
		case 13:
			return "兆";
		case 14:
			return "十兆";
		case 15:
			return "百兆";
		case 16:
			return "千兆";
		case 17:
			return "京";
		default:
			return "数字也太大了吧,呜呜呜";
		}
	}
	public String convert(int num){
		if (num==0){
			return "零";
		}
		String result = "";
		int [][] array = getNumAndDigitArr(num);
		inversion2(array);
		int [] n1 = array[0];
		int [] n2 = array[1];
		for(int i = 0;i<n1.length;i++){
			if(i>0) {
				//如果前一位数是0且这一位是0,则不输出这一位
				if (n1[i - 1] == 0 && n1[i]==0) {
					continue;
				}
			}
			//如果当前位数==6,即10万,且第一位数字为1,则不输出这个1,只输出位
			if (n2[i]==6 && n1[i]==1){
				result = result.concat(outChineseDigit(n2[i]));
				continue;
			}

			//如果当前位是0,且这个数本身是  的整数
			int temp = (int)Math.pow(10,n2[i]);
			if(n1[i]==0 && num%temp==0 ){
				continue;
			}
			result = result.concat(outChineseNum(n1[i]));
			if (n1[i]==0){
				//如果该位数是0,则不输出位数了
				continue;
			}
			//位数
			result = result.concat(outChineseDigit(n2[i]));
		}
		return result;
	}
	//给定一个字符串,判断字符串中有几个子串
	public int numOfSubstr(String str,String sub){
		return str.length() - str.replace(sub,"").length();
	}
	//给定一个字符串,给定一个子串,把字符串中除最后一个子串外全部替换
	public String replaceSomeThing(String str,String sub){
		while (this.numOfSubstr(str,sub)>1){
			str = str.replaceFirst(sub,"");
		}
		//如果最开始有“壹十”,则替换成十即可
		if(str.indexOf("壹十")==0)
			str = str.replaceFirst("壹十","十");
		return str;
	}
	public String startConvert(int num){
		int digit = getDigitNumSum(num);//获取位数
		String result = convert(num);
		String sub = "万";
		result = replaceSomeThing(result,sub);
		if (digit>9){
			sub = "亿";
			result = replaceSomeThing(result,sub);
		}
		return result;
	}
	public static void main(String[] args) {
		NumConvert nc = new NumConvert();
		Scanner input = new Scanner(System.in);
		System.out.println("请输入一个数字:");
		int num = input.nextInt();
		String result = nc.startConvert(num);
		System.out.println(result);
	}
}
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值