黑马程序员技术交流社区
标题:
金额转换,阿拉伯数字的金额转换成中国传统的圆角分
[打印本页]
作者:
奔跑的小红帽
时间:
2015-10-17 09:06
标题:
金额转换,阿拉伯数字的金额转换成中国传统的圆角分
金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出,该怎么实现
作者:
史世锋
时间:
2015-10-17 10:06
public class Test10
{
/**第10题:金额转换,阿拉伯数字转换成中国传统形式。 例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整
*
* 分析: 1010 0000 1010
* 壹仟零壹拾 亿 零 壹仟零壹拾 圆整
* 1010 0101 1010
* 壹仟零壹拾 亿 零壹佰零壹 万 壹仟零壹拾 圆整
* 1111 1111 1111
* 壹仟壹佰壹拾壹 亿 壹仟壹佰壹拾壹 万 壹仟壹佰壹拾壹 圆整
*
*
* 结论:通过分析找出一个规律:将一串数字从低位开始以4个数字为一组进行分组,
* 每一组数字的位数是固定的第1位是个位,第2位是十位,第3位是百位,第4位是千位
* 每一组的结尾处都有一个计数单位,比如 ****亿****万****圆
*
* 假如数字的位置是i,我们可以通过i%4来获得该数字是个位还是百位、千位、万位
* 如果i%4==0,那么在该数字后就要加上计数单位,再用i/4确定是加哪个计数单位
* i/4==0--------圆
* i/4==1--------万
* i/4==2--------亿
*
* 将这一串数字转换为字符串后比较容易对每个数字处理。
* 如何获得大写的数字?
* 通过String类的charAt()方法获取字符,然后那该字符减去48('0'的ASCII码是48),
* 再通过查表法获得该数字的大写
*
* 思路:
* 1.将要转换的数字先转换为字符串,然后在将字符串反转(反转后数字的最高位在字符串的尾端,先从尾端开始判断)
*
* 2.定义一个StringBuilder类的对象cn,用于存放转换后的结果。
*
* 3.定义一个boolean类型的标识符flag,用于记录是否出现连续多个0
*
* 4.从尾端开始遍历字符串,取出第i位字符ch,判断ch-48是否等于0:
* 如果等于0,如果flag为true,将'零'存进cn;flag为false则继续判断下一位
* 如果不等于O,将数字的大写及位数存进cn,并将flag置为true。
*
* 5.判断每一位之后要判断一下i%4是否等于0,如果等于0,就要存入相应的计数单位(圆、万、亿)
* 在存入计数单位之前,应判断cn的最后一位是不是'零',是'零'就要删去,避免出现"零圆"、"零万"、"零亿"
*
* 6.特殊情况:如果万位至千万位之间都是0 则会出现****亿万****圆的情况,需要特殊处理,将'万'替换为'零'
*
* @param args
*/
public static void main(String[] args)
{
show(101000001010L);
show(103000000000L);
show(104000500000L);
show(106000700008L);
show(123456789876l);
show(9400015l);
show(1023l);
}
public static void show(long money)
{
System.out.println(money + ":" + transToChinese(money));
}
//阿拉伯数字转换成中国传统形式
public static String transToChinese(long money)
{
//如果money等于0,直接返回零,如果大于一万亿,则抛异常
if(money == 0)
return "零";
if(money >= 1000000000000L)
throw new RuntimeException("钱太多处理不了");
//将数字转换为字符串,再将字符串转换为字符数组进行反转
// String str = new Long(money).toString();
String str = String.valueOf(money);
char[] tempch = str.toCharArray();
for(int x = 0, y = tempch.length - 1; x < y; x++,y--)
{
char temp = ' ';
temp = tempch[x];
tempch[x] = tempch[y];
tempch[y] = temp;
}
str = new String(tempch);
//用于查表法的数组
char[] capital = new char[]{'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'};
String[] place = new String[]{ "", "拾", "佰", "仟"};
String[] unit = new String[]{"圆整", "万", "亿"};
//cn用于存放转换为中文的结果,flag用于标识是否出现连续多个0
StringBuilder cn = new StringBuilder();
boolean flag = true;
//从尾端开始遍历字符串
for(int i = str.length() - 1; i >=0; i--)
{
int ch = str.charAt(i);
//判断字符是否是'0'
if(ch-48 ==0)
{
//第一次出现零,存入cn,将flag置为false
if(flag)
{
cn.append(capital[0]);
flag = false;
}
else
{
//连续多个零,后面的零就不在存入,继续判断下一个字符
//在继续之前判断是否需要存入计数单位,并先判断计数单位前是不是有'零',并将flag置为true
if(i%4 ==0)
{
if(cn.charAt(cn.length()-1) == '零')
cn.deleteCharAt(cn.length()-1);
cn.append(unit[i/4]);
flag = true;
}
continue;
}
}
else //字符不是'0'就存入cn,并存入其位数(个位、十位、百位、千位),并将flag置为true
{
cn.append(capital[ch - 48]);
cn.append(place[i%4]);
flag = true;
}
//每次循环都判断是否需要存入计数单位,并先判断计数单位前是不是有'零',并将flag置为true
if(i%4 ==0)
{
if(cn.charAt(cn.length()-1) == '零')
cn.deleteCharAt(cn.length()-1);
cn.append(unit[i/4]);
flag = true;
}
}
//特殊情况:出现****亿万****圆的情况,将'万'替换为'零'
// 此举可能导致出现"零零"或者"零圆",将多余的'零'删去
int index = 0;
if((index = cn.indexOf("亿万")) != -1)
cn.replace(index+1,index+2,"零");
if((index = cn.indexOf("零零")) != -1)
cn.deleteCharAt(index);
if((index = cn.indexOf("零圆")) != -1)
cn.deleteCharAt(index);
return cn.toString();
}
}
复制代码
作者:
奔跑的小红帽
时间:
2015-10-17 11:57
太给力了,
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2