黑马程序员技术交流社区
标题:
雷锋同志请进
[打印本页]
作者:
陈召
时间:
2014-12-28 23:37
标题:
雷锋同志请进
/*10、 金额转换,阿拉伯数字转换成中国传统形式。
例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整*/
public class Test10 {
public static void main(String[] args) {
// 键盘接收数字
Scanner sc=new Scanner(System.in);
String str=sc.next();
// change转换方法
change(str);
}
// 定义一个转换的方法
private static void change(String str) {
// 将汉字数字和单位装入数组
String [] num={"壹","貳","叁","肆","伍","陆","柒","捌","玖"};
String [] mea={"圆","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟","万"};
String str2="";
for (int i = 0; i < str.length(); i++) {
if (Integer.parseInt(str)==0) {//考虑输入0的情况,直接提示无效数字
System.out.println("无效数字!");
}
if(str.startsWith("0")) {//考虑0开头的情况,通过substring得到去掉开头的0,得到新str
str=str.substring(1);
i--;
continue;
}
if (i==0) {//首位不是0的时候,得到对应的汉字数字+对应的单位
str2 += num[Integer.parseInt(str.charAt(i)+"")-1]+mea[str.length()-i-1];
i++;
}
if (Integer.parseInt(str.charAt(i)+"")==0) {//考虑中间可能有0
str2+="零";
i++;
if (Integer.parseInt(str.charAt(i)+"")==0) {
i++;
}
}
str2 += num[Integer.parseInt((str.charAt(i))+"")-1]+mea[str.length()-i-1];
if (i==str.length()-1) {//最后一位时,加上"整"
str2 +="整";
}
}
System.out.println(str2);
}
}
以上是我写的代码,不够完善,比如说输入1002能打印,输入1000就会报错,还有接收的数字过大也会报错。大概知道是哪里的问题,但是不知道该怎么改?哪位大神指点一下?
作者:
赖永树
时间:
2014-12-29 20:58
本帖最后由 赖永树 于 2014-12-29 21:01 编辑
太长就不看你的了
作者:
陈召
时间:
2014-12-30 00:36
赖永树 发表于 2014-12-29 20:58
太长就不看你的了
.....{:3_47:}
作者:
Eagle
时间:
2014-12-30 08:26
楼主,我贴一下我的代码吧。比你的长的多了。
可以满分通过的哟。嘿嘿
package com.itheima;
/**
* 10、 金额转换,阿拉伯数字转换成中国传统形式。
* 例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整
*
* 思路:
*
* 1、把小数点前后分开,分别处理。
*
* 2、将切割后的字符串金额转换为字符数组
*
* 3、将字符转成整数型。
*
* 4、用转换的整数去查表。
*
* 5、每获取一个整数的大写形式,就在后面跟上相应的单位,如拾、佰、仟、万等单位。存储在缓冲区中。
*
* 6、再将零拾等替换成零。去除多余零等操作。
*
* 7、将替换完毕后的字符串返回
*
*
* 大写中零的规则:
*
* 阿拉伯金额数字万位和元位是“0”,或者数字中间连续有几个“0”,万位、元位也是“0”但千位、角位不是“0”时,
* 中文大写金额中可以只写一个零字,也可以不写“零”字,如¥1680.32应写成人民币壹仟陆佰捌拾元零叁角贰分,或者写成人民币壹仟陆佰捌拾元叁角贰分。
* 又如¥107000.53应写成人民币壹拾万柒仟元零伍角叁分,或者写成人民币壹拾万零柒仟元伍角叁分。
*/
public class Test10 {
public static void main(String[] args) {
//将要被转换的金额
String moneyNum = "101000001010";
//转换金额
String str = moneyCast(moneyNum);
//打印转换后的金额
System.out.println("¥"+str);
}
// 将阿拉伯金额转成大写的金额,最大转换金额单位:万亿,最小:毫
public static String moneyCast(String moneyStr) {
//如果金额为空,返回零圆整
if(moneyStr==null || moneyStr.equals(""))
throw new RuntimeException("金额为空!");
// 用的是查表法,这是0-9的大写表格。
String[] bigNum = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
// 这是相应位数后面的单位
String[] unit = { "圆", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾",
"佰", "仟", "万" };
// 确定金额的正负,并将前面的负号去掉
String head = "";
if (moneyStr.startsWith("-")) {
head = "负";
moneyStr = moneyStr.replace("-", "");
}
// 将整数部分和小数部分切割分开进行大写转换
String[] temp = moneyStr.split("\\.");
// =====================================================
/**
* 整数部分转换
*/
//将整数部分的0去掉
while(temp[0].startsWith("0")) {
temp[0] = temp[0].replaceFirst("0", "");
}
// 获取前面整数部分的整数形式的数组
int[] startMoney = strToInt(temp[0]);
// 当输入的金额超出转换能力时,直接抛出错误提示。不再进行转换
if (startMoney.length > unit.length)
throw new ArrayIndexOutOfBoundsException("位数超出!");
// 定义一个整数,作为查找位数后面的单位的指针
int unitLeng = startMoney.length;
// 缓冲区用于装查表后的结果。
StringBuilder sb = new StringBuilder();
// 遍历前面整数,查表,添加到缓冲区
for (int i = 0; i < startMoney.length; i++) {
// 添加大写格式到缓冲区
sb.append(bigNum[startMoney[i]]);
// 添加单位到缓冲区
sb.append(unit[--unitLeng]);
}
// 将缓冲区的字符串取出
String bigMoney = sb.toString();
// 对字符串进行去除多余文字的处理。如零佰、零仟、多个零等等。
bigMoney = bigMoney.replaceAll("零[拾佰仟]", "零").replaceAll("零+万", "万")
.replaceAll("零+亿", "亿").replaceAll("亿万", "亿零")
.replaceAll("零+圆", "圆").replaceAll("零+", "零");
//如果整数部分为零,就去掉所有整数部分的字符串
if(bigMoney.matches("[万亿]?(万亿)?圆"))
bigMoney = "";
// =========================================================
// 如果没有小数,并且整数部分为零,直接返回零圆整
if (temp.length == 1 && bigMoney.equals(""))
return "零圆整";
// 如果没有小数,并且整数部分不为零,直接返回整数部分
else if(temp.length == 1)
return head + bigMoney + "整";
/**
* 小数部分转换
*/
// 小数部分的单位表格
String[] smallUnit = { "角", "分" };//可扩展 "厘", "毫"
// 获取小数部分的整数形式的数组
int[] endMoney = strToInt(temp[1]);
// 判断小数部分的位数是否超出范围
if (endMoney.length > smallUnit.length) {
throw new ArrayIndexOutOfBoundsException("小数点后面的位数超过了4位!");
}
// 创建缓冲区,用于存储小数部分的大写形式
StringBuilder sbd = new StringBuilder();
// 遍历查表将数字与单位添加进缓冲区。
for (int x = 0; x < endMoney.length; x++) {
// 添加数字的大写格式
sbd.append(bigNum[endMoney[x]]);
// 添加小数的单位
sbd.append(smallUnit[x]);
}
// 将缓冲区数据转为字符串,方便进行替换操作
String smallStr = sbd.toString();
// 去掉多余零和其他多余的字符。
smallStr = smallStr.replaceAll("零[角分]", "").replaceAll("零+", "零");
// 整数部分为零的情况
if (bigMoney.equals("")) {
//小数部分为零,返回零圆整
if(smallStr.equals(""))
return "零圆整";
//小数部分不为零,直接返回符号和小数部分
else
return head + smallStr;
}
// 如果小数部分为零,就将整数部分后面加上整字符。
if (smallStr.equals(""))
bigMoney = bigMoney + "整";
// 都不为零就将整数部分加上小数部分
else {
//将个位为零的情况在圆后面加上零。
if(bigMoney.matches(".+[拾佰仟万亿]圆"))
bigMoney = bigMoney + "零";
bigMoney = bigMoney + smallStr;
}
// 返回符号和大写金额。
return head + bigMoney;
}
// 将字符串转为整数数组
public static int[] strToInt(String temp) {
// 将字符串转为字符数组
char[] chs = temp.toCharArray();
// 新建int数组用于装金额的单个整数形式
int[] arr = new int[chs.length];
// 遍历字符数组
for (int a = 0; a < chs.length; a++) {
// 将字符转为字符串
String ch = Character.toString(chs[a]);
// 将字符串转为int类型
try {
int i = Integer.parseInt(ch);
// 存入int类型的数组
arr[a] = i;
// 处理用户输入错误字符的情况
} catch (NumberFormatException e) {
throw new NumberFormatException("输入的金额格式有误!");
}
}
// 将整数形式的数组返回
return arr;
}
}
复制代码
作者:
菜鸟一号
时间:
2014-12-30 09:48
Eagle 发表于 2014-12-30 08:26
楼主,我贴一下我的代码吧。比你的长的多了。
可以满分通过的哟。嘿嘿
好人。。。。。。感谢了
作者:
任我行
时间:
2014-12-30 10:17
我两头像一样诶 赞一个
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2