java数字转成中文

最近参加校招笔试,又遇到这类题目,每次都考虑不全情况,网上查类似的,好多不全或是大写什么的,自己试着写了一下
java实现的,5位数以内的,目前除了0不行,还没发现其他bug
思路没想太多,应该有更好的,利用栈,逆序来判断数字,再添加多种情况(主要就是零的问题)
   

10要输出“十”                                      10->十

数字结尾多个零的省略                     100->一百

中间连续几个零只输出一个零         1001->一千零一

正常情况                                             12345->一万二千三百四十五

import java.util.Scanner;
import java.util.Stack;


public class Change_num {

	public static String a(int i)//输出位
	{
		if(i==0)
			return "";
		else if(i==1)
			return "十";
		else if(i==2)
			return "百";
		else if(i==3)
			return "千";
		else 
			return "万";
	}
	
	public static  String b(int j)//输出数字
	{
		switch (j) {
		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"八";
		default:return "九";
		}
		
	}

	public static void main(String[] args)
	{
		Stack<Integer> s1 = new Stack<Integer>();
		Stack<Integer> s2 = new Stack<Integer>();
		Stack<String> nstr = new Stack<String>();//存放中文数字的栈
		
		System.out.println("请输入一个五位以内的数字:");//输入五位数
		Scanner in=new Scanner(System.in);
		int num=in.nextInt();
		in.close();
		
		while(num!=0)//逆序放入第一个栈 4,3,2,1
		{
			s1.push(num%10);
			num=num/10;
		}
		
		while(s1.size()!=0)//正序放入第2个栈 1,2,3,4
		{
			s2.push((s1.pop()));
		}
		
		int x=s2.size();//记录栈长度
		
		//相当于逆序出栈,判断
		while(s2.size()!=0)
		{
			int tab=s2.pop();
			if(x==2&&s2.size()>=1&&s2.peek()==1)//特殊情况,10的
			{
				nstr.push("十");
				break;
			}
			else if(tab!=0&&s2.size()>1&&s2.peek()==0)//要输出零的情况,逆序时只有当前一位不为零,下一位为零才出现零
			{
				nstr.push(a(x-1-s2.size()));
				nstr.push(b(tab));	
				nstr.push("零");	
			}
			else if(tab!=0)//一般情况,不用管0的
			{
				nstr.push(a(x-1-s2.size()));
				nstr.push(b(tab));
			}
		}
		
		while(nstr.size()!=0)//打印
		{
			System.out.print(nstr.pop());
		}
		
	}

}

第一次写这个,留着以后方便看

转载请说明

点赞