黑马程序员技术交流社区
标题:
勉强做到了
[打印本页]
作者:
j420984
时间:
2015-6-29 08:28
标题:
勉强做到了
/**
* 10、 金额转换,阿拉伯数字转换成中国传统形式。 例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整
*
* @author:Jwd
*
*/
public class Exam10 {
public static void main(String[] args) throws IOException {
System.out.println("请从键盘上随便输入一个金额");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
System.out.println(numToWorda(s).toString().replaceAll("零[拾佰仟]","零").replaceAll("零+亿","亿").replaceAll("零{3}万","零").
replaceAll("零+万","万").replaceAll("零+圆","圆").replaceAll("零+","零"));
}
public static StringBuffer numToWord(String num) {
char[] arr = num.toCharArray();
StringBuffer result = new StringBuffer("圆整");
Map<String, String> m = new HashMap<String, String>();
Long no = Long.parseLong(num);
Long nr = no;
String key = "";
String value = "";
for (int j = arr.length; j > 0; j--) {
key = Integer.toString(10 + j);
if (j != 8 && j != 12) {
switch (j % 4) {
case 1:
value = "拾";
break;
case 2:
value = "佰";
break;
case 3:
value = "仟";
break;
case 0:
value = "万";
break;
}
} else if (j == 8) {
value = "亿";
}
m.put(key, value);
}
m.put("0", "零");
m.put("1", "壹");
m.put("2", "贰");
m.put("3", "叁");
m.put("4", "肆");
m.put("5", "伍");
m.put("6", "陆");
m.put("7", "柒");
m.put("8", "捌");
m.put("9", "玖");
String sz = "";// 当前值
if (nr != 0) {
for (int i = 0; i < arr.length; i++) {
// 除10取余
nr = no % 10;//nr初始值为输入值,后为取余值,即当前值的阿拉伯形式。。
no = no / 10;
sz = m.get(nr.toString());// 获取值
if (nr == 0 && i != 8 && i != 4) {// i为零时从MAP中找不到对应的单位.
System.out.println("=======000000000");
// result = result.insert(0, m.get(Integer.toString(10 +
// i)));// 获取单位
result = result.insert(0, sz);// 将当前值放在字符串最前面.
} else if (nr != 0) {
System.out.println("!!!!!!!!!!!!!!!!!!!!0");
result = result.insert(0, m.get(Integer.toString(10 + i)));// 获取单位
result = result.insert(0, sz);// 将当前值放在字符串最前面.
} else if (nr == 0 && (i == 8 || i == 4)) {
System.out.println("444444!!!!!!!!!!!!!!!!0");
result = result.insert(0, m.get(Integer.toString(10 + i)));// 获取单位
}
}
} else {
return result.insert(0, "零");
}
return result;
}
public static StringBuffer numToWorda(String num) {
char[] arr = num.toCharArray();
StringBuffer result = new StringBuffer("圆整");
Map<String, String> m = new HashMap<String, String>();
Long no = Long.parseLong(num);
Long nr = no;
String key = "";
String value = "";
for (int j = arr.length; j > 0; j--) {
key = Integer.toString(10 + j);
if (j != 8 && j != 12) {
switch (j % 4) {
case 1:
value = "拾";
break;
case 2:
value = "佰";
break;
case 3:
value = "仟";
break;
case 0:
value = "万";
break;
}
} else if (j == 8) {
value = "亿";
}
m.put(key, value);
}
m.put("0", "零");
m.put("1", "壹");
m.put("2", "贰");
m.put("3", "叁");
m.put("4", "肆");
m.put("5", "伍");
m.put("6", "陆");
m.put("7", "柒");
m.put("8", "捌");
m.put("9", "玖");
String sz = "";// 当前值
if (nr != 0) {
for (int i = 0; i < arr.length; i++) {
// 除10取余
nr = no % 10;//nr初始值为输入值,后为取余值,即当前值的阿拉伯形式。。
no = no / 10;
sz = m.get(nr.toString());// 获取值
if (nr == 0 && i != 0&&i!=4&&i!=8) {// i为零时从MAP中找不到对应的单位.
System.out.println("当前值为0此时i="+i);
result = result.insert(0, sz);// 将当前值放在字符串最前面.
} else if (nr != 0&&i!=0) {
System.out.println("当前值不为0此时i="+i);
result = result.insert(0, m.get(Integer.toString(10 + i)));// 获取单位
result = result.insert(0, sz);// 将当前值放在字符串最前面.
}else if (i==0&&nr==0){
System.out.println("当前值为个位且为0此时i="+i);
result = result.insert(0, "");// 将当前值放在字符串最前面.
}else if (i==0&&nr!=0){
System.out.println("当前值为个位且不为0此时i="+i);
result = result.insert(0, sz);// 将当前值放在字符串最前面.
}else if (nr == 0 && i != 0&&(i==4||i==8)){
System.out.println("当前值为0此时i=48+"+i);
result = result.insert(0, m.get(Integer.toString(10 + i)));// 获取单位
}
}
} else {
return result.insert(0, "零");
}
return result;
}
}
最后实思绪实在太乱了,直接用正则处理StringBuffer了
作者:
asinzuo
时间:
2015-6-29 09:43
真的比较乱
作者:
luorenyu
时间:
2015-6-29 10:02
我表示看不懂!:'(
作者:
1958078929
时间:
2015-6-29 10:05
谢谢分享
作者:
guiqulaixi
时间:
2015-6-29 11:00
应该还可以有更简单的
作者:
1千克=1024克
时间:
2015-6-29 12:58
零太难处理了.. 其他感觉还好
作者:
ayang
时间:
2015-6-29 13:03
楼主 ,好厉害,加油奥
作者:
zhangfurui
时间:
2015-6-29 14:09
好厉害啊
作者:
zuopiezi
时间:
2015-6-29 14:46
太乱了。。。。。。。
作者:
j420984
时间:
2015-6-29 14:57
1千克=1024克 发表于 2015-6-29 12:58
零太难处理了.. 其他感觉还好
我被零和单位万及亿伤透了。
作者:
397543420
时间:
2015-6-29 15:05
还差两个技术分,,
作者:
j420984
时间:
2015-6-29 15:26
397543420 发表于 2015-6-29 15:05
还差两个技术分,,
你错了,应该是还差一黑马币
作者:
weiwei1
时间:
2015-6-29 18:01
看起来很厉害的样子
作者:
zhand
时间:
2015-6-29 23:42
头像不错 哈哈
作者:
一口老郭
时间:
2015-6-30 14:07
楼主好厉害
作者:
zlpiano
时间:
2015-6-30 14:49
不错不错,研究一下
作者:
qingger
时间:
2015-6-30 15:23
晕了,高手
作者:
fanxin_meng
时间:
2015-6-30 16:07
不错不错,研究一下
作者:
虾米吃螃蟹
时间:
2015-6-30 16:18
楼主加油!!!
作者:
YongBao_Summer
时间:
2015-6-30 16:57
加油加油。~
作者:
汪磊の
时间:
2015-6-30 18:03
楼主好腻害,顶!
作者:
Diors
时间:
2015-6-30 19:54
错了,太长的不能处理,请从键盘上随便输入一个金额 1000233243243 当前值为个位且不为0此时i=0 当前值不为0此时i=1 当前值不为0此时i=2 当前值不为0此时i=3 当前值不为0此时i=4 当前值不为0此时i=5 当前值不为0此时i=6 当前值不为0此时i=7 当前值不为0此时i=8 当前值为0此时i=9 当前值为0此时i=10 当前值为0此时i=11 当前值不为0此时i=12 壹拾零贰亿叁仟叁佰贰拾肆万叁仟贰佰肆拾叁圆整
作者:
Diors
时间:
2015-6-30 19:56
我认为该用递归解决的
作者:
腹黑生姜
时间:
2015-6-30 22:34
代码好长的!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2