写在前面
无意间看到一个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);
}
}