我是来贴代码赚积分的 ,刚开始思路不对,用了好多循环,最后简化成这样,递归真是个好东西
public static void main (String[] args){
long number=2300340099121419870L; //一个超长的数字,取值范围为long类型的最大值
String value= transform("", number);
System.out.print(value);
}private static String transform(String word, long number){
String tempStr=""+number;
int len=tempStr.length(); //获取数字长度
if (len==1){
word+=getChineseWord(number); //如果剩个位数那么直接转换,并结束递归
return word;
}
long baseNum= getBaseNum(len); //根据数字长度获取元单位(兆,亿,万等)
long single= (number/baseNum); //查看有多少个元单位
if (single>10&&single<baseNum){
word+=transform("",single); //个位数以上的元单位递归处理
}else
{
word+=getChineseWord(single); //个位数的元单位转换后,继续执行
}
word=checkZero(word); //避免 零万 零零万等情况出现
word+=getChineseWord(baseNum); //拼接汉字元单位
number%=baseNum; //去掉已转换的顶位,继续转换从元单位开始以下的数字
if (number/(baseNum/10)==0){ //如果下一位是"0",那么拼接"零"字符
if (len-1==1) return word; //拼接中如果下一位已经是最后一位,那么中断拼接,直接返回.
word+=getChineseWord(0);
}
return transform(word,number); //递归执行,直到len==1结束.
}private static String getChineseWord(long number){
if (number==10E15){//因switch 判断条件不能为long值,所以单独判断
return "兆";
}
switch ((int)number){
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 100:
return "佰";
case 1000:
return "仟";
case 10000:
return "万";
case 100000000:
return "亿";
}
return "";
}
private static Long getBaseNum(int len){
long num=1L;
if (len>=17){ //兆级别 ,long类型最长为19位,所以兆级别足矣
len=17;
}else if (len>=9){ //亿级别
len=9;
}else if (len>=5){ //万级别
len=5;
}
for (int i = 1; i < len; i++) {
num*=10;
}
return num;
}
private static String checkZero(String word){
if (word.substring(word.length()-1).equals("零")){
word=word.substring(0,word.length()-1);
return checkZero(word);
}else
{
return word;
}
}
|
|