------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);
}
}