黑马程序员技术交流社区
标题:
金额转换,阿拉伯数字转换成中国传统形式。
[打印本页]
作者:
huburt
时间:
2016-5-20 21:36
标题:
金额转换,阿拉伯数字转换成中国传统形式。
public static void main(String[] args) {
System.out.println(changeToCN(101000001010D));
}
public static String changeToCN(double money){
//大写数字
String[] big = new String[]{"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
//段位内的单位
String[] unit = new String[]{"","拾","佰","仟"};
//段位单位
String[] un = new String[]{"","萬","亿"};
//只取2位小数
String value = String.valueOf((long)(money*100));
//整数部分
String iValue = value.substring(0, value.length()-2);
//小数部分
String dValue = value.substring(value.length()-2);
//构造小数部分的大写数字
String dValueSb = "";
//如果两位小数都是0
if(dValue.equals("00")){
//添加“整”字
dValueSb +="整";
//如果小数点后1位是零
}else if(dValue.charAt(0)=='0'){
//添加格式为:零 "几" 分
dValueSb +=big[0]+big[dValue.charAt(1)-'0']+"分";
}else{
//如果小数点后2位都不是零,添加格式为:"几"角 "几"分
dValueSb +=big[dValue.charAt(0)-'0']+"角"+big[dValue.charAt(1)-'0']+"分";
}
//构造整数部分的大写数字
String iValueSb = "";
//将整数部分拆散
char[] iChar = iValue.toCharArray();
// 标志当前位的上一位是否为有效0位(如万位的0对千位无效)
boolean preZero = false;
// 连续出现0的次数
byte zeroTimes = 0;
//对每位数进行操作
for(int i=0;i<iChar.length;i++){
//段位,4位数为一个段位,0段位表示万以下,1段位表示万,2段位表示亿
int dex = (iChar.length-i-1)/4;
//段位内的位置,0代表个,1代表十,2代表百,3代表千
int index = (iChar.length-i-1)%4;
//如果当前位置的数是0
if(iChar[i]=='0'){
//记录前位是0
preZero = true;
//连续出现的0增加1
zeroTimes++;
//段位内个位数是0,只要段位内4位数不全是0,则添加段位单位:万、亿
if(index==0&&zeroTimes<4){
iValueSb +=un[dex];
// 不管上一位是否为0,置为无效0位
preZero = false;
}
}else{
zeroTimes = 0;
// 当出现不是零的数,首先查看上一位是否为有效0位
if (preZero) {
// 添加零,并且只会在此处添加一次零,不会出现重复零
iValueSb += big[0];
//复位
preZero = false;
}
//添加该数字的大写
iValueSb += big[iChar[i]-'0'];
//如果是段位内的个位,添加段位单位:万、亿
if(index==0){
iValueSb +=un[dex];
//如果不是,添加段位内单位:十、百、千
}else{
iValueSb += unit[index];
}
}
}
// 如果整数部分存在,则有圆的字样
if (iValueSb.length() > 0)
iValueSb += '圆';
// 返回拼接起来的值
return iValueSb + dValueSb;
}
复制代码
作者:
菜鸟小白
时间:
2016-5-20 22:16
big[dValue.charAt(0)-'0'],请问这里边dValue.charAt(0)-'0'是什么意思
作者:
我有上将潘凤
时间:
2016-5-20 23:08
厉害啊。。。
作者:
a825105162
时间:
2016-5-21 08:56
菜鸟小白 发表于 2016-5-20 22:16
big[dValue.charAt(0)-'0'],请问这里边dValue.charAt(0)-'0'是什么意思
将字符转换成数字,char(At)得到的是字符不是int型数字所以要减去‘0的字符值’得到0
作者:
pal_xie
时间:
2016-5-21 22:16
看了略长 之前也做了这道题 上网搜索了一下 感觉自己就是个弱智
public class Test9 {
/**
* 第九题: 金额转换,阿拉伯数字转换成中国传统形式。 例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整
*
* @param args
*/
public static void main(String[] args) {
//测试
System.out.println(converse(640_0000_0023L));
}
private static String converse(long num) {
//建立汉语数字数组
char[] chineseNum = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };
//建立汉语量次数组
char[] unite = { '圆', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰',
'仟' };
int index = 0;
long lastNum;
//从尾到头将数字按位置转换成汉语数字,并在后面加入量词.
StringBuffer sb = new StringBuffer();
while (num != 0) {
lastNum = num % 10;
sb.insert(0, unite[index++]);
sb.insert(0, chineseNum[(int) lastNum]);
num /= 10;
}
//使用正则表达式去重
return sb.toString().replaceAll("零[拾佰仟]", "零").replaceAll("零 *亿", "亿")
.replaceAll("零{4}万", "零").replaceAll("零*万", "万")
.replaceAll("零+圆", "圆").replaceAll("零+", "零")
+ "整";
}
}
复制代码
作者:
okchenyang44
时间:
2016-5-21 23:34
父类使用方法的时候其实调用的是子类重写父类的方法
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2