小写数字转化为大写数字

本以为是个很简单的题,但写完之后发现各种bug,各种改。只是实现了功能而已。程序效果如下:

请输入您的数字(输入quit退出):
1
一
103
一百零三
12349234
一千二百三十四万九千二百三十四
10023002340
一百亿零二千三百万零二千三百四十
100000000000
一千亿
324034030
三亿二千四百零三万四千零三十
1000002130
一十亿零二千一百三十

源代码如下:

import java.util.Scanner;

public class Convert {
	public static String[] units= {"","十","百","千","万"};
	public static String[] flagUnits= {"","万","亿"};
 
	public static void main(String[] args)
	{
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入您的数字(输入quit退出):");
		
		while(true)
		{
			String number=sc.nextLine();
			if(number.equals("quit"))
				break;
			System.out.println(getResult(number));
		}
	}
	
	static String getResult(String number)
	{
		int numberLen=number.length();
		int subFlag=(int) Math.ceil(number.length()/4.0);
		boolean isFirstCharArray=true;
		StringBuffer sbResult=new StringBuffer();
		int notZeroFlag=0;
  
		while(number.charAt(numberLen-1-notZeroFlag)=='0')
		{	
			notZeroFlag++;
		}
  		
		while(subFlag>(notZeroFlag)/4)
		{	
			if(isFirstCharArray)
			{
				char[] subCharArray=new char[numberLen%4==0?4:numberLen-(subFlag-1)*4];
				subFlag--;
				number.getChars(0, subCharArray.length, subCharArray, 0);
				sbResult.append(getSubResult(subCharArray,subFlag,notZeroFlag));
				isFirstCharArray=false;
			}
			else
			{		
				char[] subCharArray=new char[4];
				number.getChars(numberLen-(subFlag--)*4, numberLen-(subFlag)*4, subCharArray, 0);
				sbResult.append(getSubResult(subCharArray,subFlag,notZeroFlag));
			}
		}
		
		return deleteZero(sbResult);
	}
 
	static StringBuffer getSubResult(char[] sub,int subflag,int notZeroFlag)
	{
		int zeroFlag=0;
		
 		while(sub[sub.length-1-zeroFlag]=='0')	
		{
			zeroFlag++;
			if(zeroFlag==sub.length)
			{
				return new StringBuffer("零");
			}
		}
  
		StringBuffer sb=new StringBuffer();
  
		for(int i=0;i<sub.length-zeroFlag;i++)
		{
			sb.append(charToStr(sub[i]));
			if(sub[i]=='0')
			{
				continue;		
			}
			sb.append(units[sub.length-i-1]);
		}
		
		sb.append(flagUnits[subflag]);
		if(zeroFlag!=0&&subflag!=0&&notZeroFlag/4!=subflag)
		{
			sb.append("零");
		}
		return sb;
	}
 
	static String deleteZero(StringBuffer sb)
	{
		for(int i=0;i<sb.length()-1;i++)
		{
			if(sb.charAt(i)==sb.charAt(i+1))
			{
				sb.replace(i, i+1, "");
				i--;
			}
		}
		return sb.toString();
	}
 
	static String charToStr(char numChar)
	{
		switch(numChar)
		{
			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 '0':
				return "零";
			default:
				return "";
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值