看了网上好多人使用面向对象写的,其实面向过程的方法也挺好,就是需要讨论,然后模拟一下 就能,我只写了到亿位的。
下面是代码,要理解的话可看注释
import java.util.Scanner;
public class Main {
public static char []l1=new char[]{'零','壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖', '拾'};
public static char []l2=new char[]{'分','角','元', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿'};
public static char l3='整';
public static void main(String []args) {
Scanner sc=new Scanner(System.in);
String str=sc.next();//输进字符串类型的数
char []b=new char[18];
int []a=new int[18];
int j=0;
int flag=0;
int flag1=0;
int flag2=0;
for(int i=0;i<str.length();i++)//转到字符类型的
b=str.toCharArray();
for(int i=str.length()-1;i>=0;i--)//转成十进制类型的
if(b[i]!='.'){
a[j]=(int)(b[i]-48);
j++;
}
//System.out.printf("%d\n",j-1);
for(int i=j-1;i>=2;i--)//遍历,直到元,对分和角 特判
{
if(a[i]!=0)//对于整数部分,若不为零的时候讨论一下
{
flag=1;
if(a[i]!=1)//对于1要特判,在为4或8时,不用输出1
System.out.printf("%c",l1[a[i]]);
else//4/8不用输出1
if(j!=4&&j!=8)
System.out.printf("%c",l1[a[i]]);
}
else//当整数部分为零时,讨论
{
if(j-1!=i)//首位为零不输出
if(a[i]==0&&a[i-1]!=0)//遇见多个零,在最后一个输出
System.out.printf("%c",l1[a[i]]);
}
//对单位输出,注意拾,万,亿。
if(flag==1&&i==2)//只要前面不为零
System.out.printf("元");
if(i>=3&&i<=5)//区间判断2--5位
{
if(a[i]!=0)
System.out.printf("%c",l2[i]);
}
if(i>5&&i<=9)//区间判断6--9位
{
if(a[i]!=0) {
flag1=1;
if(i!=6)
System.out.printf("%c",l2[i]);
}
}
if(flag1==1&&i==6)//只有在此区间内不为零时,才能输出
System.out.printf("%c",l2[i]);
if(i>=10)//区间判断大于等于10位
{
if(a[i]!=0) {
flag2=1;
if(i!=10)
System.out.printf("%c",l2[i]);
}
}
if(i==10&&flag2==1)//只有在以上区间不为零时,才能输出
System.out.printf("%c",l2[i]);
}
//对角,分特别判断!
if(a[0]==0&&a[1]==0)
System.out.printf("%c",l3);
else if(a[0]==0&&a[1]!=0)
System.out.printf("%c%c",l1[a[1]],l2[1]);
else if(a[0]!=0&&a[1]==0)//0.03和1.03的区别
{
if(flag==1)
System.out.printf("%c%c%c",l1[a[1]],l1[a[0]],l2[0]);
else
System.out.printf("%c%c",l1[a[0]],l2[0]);
}
else
System.out.printf("%c%c%c%c",l1[a[1]],l2[1],l1[a[0]],l2[0]);
}
}