黑马程序员技术交流社区
标题:
分享一道入学测试
[打印本页]
作者:
zfgrinm
时间:
2015-3-8 09:29
标题:
分享一道入学测试
package com.itheima;
/*
*
10、 金额转换,阿拉伯数字转换成中国传统形式。
例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整
*/
public class Test10 {
public static void main(String[] args) {
// TODO Auto-generated method stub
double d=101000001010.12;
System.out.println(getChineseMoney(d));
}
/*
* 金额转换函数:
* 将金额粉整数和小数部分,小数部分好读,整数部分转为字符串并反转,这样从左往右读取时和单位变化一直,便于读取单位;
* 每四维分一段,每个数字读取其大写数字和对应的段中单位,并在每一段加段单位;
* 最后通过正则和字符串的操作去除多余的大写数字。
*
*/
public static String getChineseMoney(double d){
String [] numbers={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};//建立每个数字的大写数组
String [] units={"","拾","佰","仟"};//每一段中的单位
String [] divs={"","万","亿"};//每一段的单位(只考虑千亿以内的金额,千亿之外方法类似)
String [] sufdivs={"角","分"};//小数后面部分(取两位)
long l=(long)d;//获取金额整数部分
int sufI=(int)(d*100%100);//获取金额小数部分
String str=String.valueOf(l);//整数部分转为字符串
//通过StringBuilder反转字符串,这样从左忘右读取,这样角标对应的单位(段中单位,每一段单位)在
//units,divs中也是从左往右变化,这样便于读取单位
StringBuilder strb=new StringBuilder(str);
strb.reverse();
str=strb.toString();
StringBuilder sb=new StringBuilder();//创建StringBuilder用于存储读到的每一位数字转为大写数字。
int []arrInt=new int[str.length()];//int型数字用于存储每一位的数字
for(int i=0;i<str.length();i++){
arrInt[i]=Integer.valueOf(str.substring(i,i+1));//字符串中每一位数字赋给数组arrInt中每一位;
//读取每一位并添加到sb中
if(i==4){//读取到第五位时加上段单位”万“
sb.insert(0, numbers[arrInt[i]]+divs[i/4]);
}else if(i==8){//"读取到"第九位时加上段单位”亿“
sb.insert(0, numbers[arrInt[i]]+divs[i/4]);
}else{
//其他位的读取
if(arrInt[i]==0){//为零时,只读取零,不读取段中单位”拾佰仟“
sb.insert(0, numbers[arrInt[i]]);
}else//不为零时,读取数字和段中单位
sb.insert(0, numbers[arrInt[i]]+units[i%4]);
}
}
//读取完整数部分读取小数部分
if(sufI==0){//小数部分为0,则直接添加”圆整“,读取完毕
sb.append("圆整");
}else{//小数部分不为0,则添加”圆“并读取小数部分
sb.append("圆");
int i1=sufI/10;//去小数部分第一位
int i2=sufI%10;//小数部分第二位
//下属部分的两位只要某一位为0,则不读取,不为0,则读取数字和对应的单位”角分“
if(i1!=0){
sb.append(numbers[i1]+sufdivs[0]);
}
if(i2!=0){
sb.append(numbers[i2]+sufdivs[1]);
}
}
String strChina=sb.toString();//读取的sb转成字符串,以便于操作
strChina=strChina.replaceAll("(.)\\1+","$1");//去除叠词”零“,只取一个”零“
strChina=strChina.replace("亿零万", "亿零");//万位全为0,则不读取”万“
strChina=strChina.replace("零亿", "亿");//整拾、整百、整千亿时,去掉亿前面的零
strChina=strChina.replace("零万", "万");//整拾、整百、整千万时,去掉万前面的零
strChina=strChina.replace("零圆", "圆");//整拾、整百、整千时,去掉圆前面的零
return strChina;
}
}
复制代码
作者:
wdhm5423
时间:
2015-3-8 09:37
本帖最后由 wdhm5423 于 2015-3-8 09:40 编辑
赋值100000000000d,输出壹仟亿零圆整。待优化
作者:
zfgrinm
时间:
2015-3-8 09:49
恩,还有一种情况没考虑到啊..谢谢提醒啊,亿零万零圆整,还有一个零没去掉..
作者:
zfgrinm
时间:
2015-3-8 09:50
在81,82行之间再添加句去叠词的就可以了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2