黑马程序员------------面试题目之数字汉字转换

                                            ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

今天看到一个面试题目,乍一看一点都不难挺简单的,仔细想想还是有点难度的,据说还是什么竞赛题目,这里就拿出来与大家分享下,也留做以后查看。


需求  实现将输入的万亿之内的正整数转化为汉字书写形式

解析这个简单的需求要考虑的事其实挺多的汉字中 类似于零零这样的情况是不会出现的,通常一个零代替,但是零所在的位不同前面的表示也差别很大。

即使相邻的两位相同的数字也不是简单的对象书写能解决的。

废话不说这里就把我的两种实现方式贴出来吧,注释代码里都有,仔细看应该还是能看的懂得。(第二种方式更家简单)

package Convert;

/**
 * 实现将输入的万亿之内的正整数转化为汉字书写形式
 * @author tai
 */
public class ConvertToChinese
{
	private static String ChineseNumber = "零一二三四五六七八九";
	private static String Unit = "万千百十亿千百十万千百十";
	private static int LengthOfCN = 12;

	/***
	 * 判断str是否为合法的数字形式,如果是的话进行格式化,如果不是返回空字符串""
	 * @param str
	 * @return
	 */
	@SuppressWarnings("unused")
	private static String Format(String str)
	{
		try
		{
			str = Long.toString((Long.parseLong(str)));
			return str;
		}
		catch (Exception e)
		{
			return "";
		}
	}

	/**
	 * 将输入的万亿之内的正整数转化为汉字书写形式
	 * @param str
	 * @return
	 */
	public static String cast(String str)
	{
		// 如果不合法,则返回错误提示
		str = Format(str);
		if (str == "" || str.length() >= 14)
			return "您的输入不合法!";

		StringBuffer result = new StringBuffer();
		// 下面开始转化
		int lengthOfStr = str.length();
		int m = LengthOfCN - lengthOfStr + 1;

		char ling = '0';
		for (int i = 0; i <= lengthOfStr - 1; i++)
		{
			ling = '0';

			// 处理零的情况
			while (i <= lengthOfStr - 1 && str.charAt(i) == '0')
			{
				// 如果碰到了万和亿,则应该输出,除非两者相连的情形
				if (i < lengthOfStr - 1
						&& (Unit.charAt(i + m) == '万' || Unit.charAt(i + m) == '亿'))
				{
					ling = Unit.charAt(i + m);
					i++;
					break;
				}

				i++;
				ling = '零';
			}

			// 如果碰到应该输出的零,则回退一次并记录
			if (ling != '0')
			{
				i--;
				result.append(ling);
			}
			else
			{
				// 正常情况则正常记录
				result.append(ChineseNumber.charAt(str.charAt(i) - '0'));

				if (i < lengthOfStr - 1)
				{
					result.append(Unit.charAt(i + m));
				}
			}
		}

		// 最后在此处理
		// 首先处理最后为零的情况
		if (result.lastIndexOf("零") == result.length() - 1&&str.length()>1)
			result.deleteCharAt(result.length() - 1);

		// 再处理亿后面紧跟零,但是有万存在的情形
		int intYiLing = 0;

		// 最後處理億萬的情形
		intYiLing = result.indexOf("亿万");
		if (intYiLing >= 0)
			result.replace(intYiLing + 1, intYiLing + 2, "");

		return result.toString();
	}
}

测试类及结果:

package Convert;

public class Test
{
	public static void main(String[] args)
	{
		// TODO Auto-generated method stub
		System.out.println(ConvertToChinese.cast("10026360"));
	}

}





第二种实现,把数字列举出来,以及正常顺序下位的名称排列列举出来,之后按照位数及对象位上的数字处理输出。此种方式处理不收数字位数长度的限制。

package contest;


public class CastUpper
{

	public void cast(String str)
	{
		for (int i = 0; i < str.length(); i++)
		{
			str= Long.toString((Long.parseLong(str)));
		}
		System.out.println(str);
		
		String b = "零一二三四五六七八九";
		String c = "万千百十亿千百十万千百十";
		int l = str.length();
		int m = c.length() - l + 1;
		char ling = '0';
		char end = '0';
		for (int i = 0; i <= l - 1; i++)
		{
			ling = '0';
			while (str.charAt(i) == '0')
			{
				if(c.charAt(i + m) == '万' || c.charAt(i + m) == '亿')
				{
					ling = c.charAt(i + m);
					i++;
					if(end != '亿')break;
				}
				
				i++;
				ling = '零';
			}
			
			if(ling != '0')
			{
				i--;
				System.out.print(ling);
				
			}
			else
			{
				end = b.charAt(str.charAt(i) - '0');
				System.out.print(end);
				
				if (i < l - 1)
				{
					end = c.charAt(i + m);
					System.out.print(end);
				}
					
			}
			
		}
	}

	public static void main(String[] args)
	{
		CastUpper cast = new CastUpper();
		String str = "11026313002";
		cast.cast(str);
	}
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值