黑马程序员技术交流社区
标题:
金额转换,阿拉伯数字转换成中国传统形式。
[打印本页]
作者:
潘_洋
时间:
2015-11-10 16:09
标题:
金额转换,阿拉伯数字转换成中国传统形式。
/*
* 10、 金额转换,阿拉伯数字转换成中国传统形式。
* 例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整
*/
/*
* 分析:
* 1,要实现金额转换,首先要有数字,从键盘输入一个double类型的数字
* 2,在处理数字时不仅仅要将阿拉伯数字转换成传统格式,而且还要注意单位,每4位是一个
* 进制单位,如圆,万,亿,万亿
* 3,同时对输入的数字处理要考虑到整数和小数两个部分,在整数部分的处理中,还需要注意
* 连续多个零的情况,根据我们平时的习惯我们不会在整数部分读出所有零,我们一般都是
* 只读一个零,其他的省略
* 4,为了方便转换,我们可以把输入的double类型的小数*100转成整数,然后切割字符串,
* 对整数部分和小数部分再分别进行处理
* 5,因为String类型不能改变长度,我们可以在缓冲区操作StringBuilder,使用该类的add方法
* 对字符串进行拼接
* 6,最后,再将整数和小数部分连接起来,完成转换
*/
import java.util.Scanner;
public class Test10 {
// 定义单位,数字数组
private static String[] bigUnit = { "圆", "万", "亿", "万亿" };
private static String[] smallUnit = { "仟", "佰", "拾" };
private static String[] capital = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒",
"捌", "玖" };
private static String[] decimals = { "角", "分" };
public static void main(String[] args) {
// 键盘录入一个数,用double类型的数接收
Scanner sc = new Scanner(System.in);
double num = sc.nextDouble();
// 调用方法,传递接收到的double类型的数
System.out.println(numToRmb(num));
}
// 定义方法,实现阿拉伯数字到中国传统格式的转换
public static String numToRmb(double num) {
//String result = null;
StringBuilder sb = new StringBuilder();
long zheng = (long) num;
// 传递一个double类型的数,返回long型的最接近的传递参数的数
long xiao = Math.round((num - zheng) * 100);
String xiaoStr = String.valueOf(xiao);
String zhengStr = String.valueOf(zheng);
// 给小数部分加单位和转换数字
String end = xiaoPart(xiaoStr);
// 给整数部分加单位和转换数字
int length = zhengStr.length();
if (zhengStr.length() % 4 == 0) {
int part = zhengStr.length() / 4;
for (int i = 0; i < part; i++) {
sb.insert(0, addUnit(zhengStr, length, i));
}
/*result = */endConvent(sb.toString());
} else {
// 不能被4整出的话 在最前面用0补位补到可以被4整除
int part = zhengStr.length() / 4 + 1;
int buLing = 4 - sb.length() % 4;
StringBuilder tmpSB = new StringBuilder(zhengStr);
for (int i = 0; i < buLing; i++) {
tmpSB.insert(0, "0");
}
for (int i = 0; i < part; i++) {
sb.insert(0, addUnit(tmpSB.toString(), tmpSB.length(), i));
}
//result = endConvent(sb.toString());
}
return endConvent(sb.toString()) + end;
}
// 处理字符串 去掉大单位前面多余的零
private static String endConvent(String str) {
str = str.replace("零万亿", "万亿");
str = str.replace("零亿", "亿");
str = str.replace("零万", "万");
str = str.replace("零圆", "圆");
// 如果不能被4整出 去掉前面补的零
if (str.charAt(0) == '零') {
str = str.substring(1, str.length());
}
return str;
}
// 小数部分转换加单位
private static String xiaoPart(String xiaoStr) {
//String xiaoResult = null;
StringBuilder xiaosb = new StringBuilder();
for (int i = 0; i < xiaoStr.length(); i++) {
int k = xiaoStr.charAt(i) - 48;
xiaosb.append(capital[k] + decimals[i]);
}
//xiaoResult = xiaosb.toString();
return xiaosb+""/*.toString()*/;
}
// 整数部分添加单位并转换数字
private static String addUnit(String numStr, int length, int index) {
String result = null;
StringBuilder sb = new StringBuilder();
String tmp = null;
//得到每四位后面的大单位
String endTmp = bigUnit[index];
//将输入的数每四个分为一组,转换成int类型数字
tmp = numStr.substring(length - 4 * (index + 1), length - 4 * index);
for (int i = 0; i < tmp.length(); i++) {
if (tmp.charAt(i) == '0') {
// 把char型数字转换成的int型数字,因为它们的ASCII码值恰好相差48
// 因此把char型数字减去48得到int型数字
int k = tmp.charAt(i) - 48;
sb.append(capital[k]);
} else {
int k = tmp.charAt(i) - 48;
if (i != tmp.length() - 1) {
//将小单位加在对应的数字后面存储到缓冲区
sb.append(capital[k] + smallUnit[i]);
} else {
sb.append(capital[k]);
}
}
}
//去零操作,去掉多余的零,使用String类的替换功能
result = sb.toString() + endTmp;
result = result.replace("零零零零万亿", "零");
result = result.replace("零零零零亿", "零");
result = result.replace("零零零零万", "零");
result = result.replace("零零零零", "零");
result = result.replace("零零零", "零");
result = result.replace("零零", "零");
return result;
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2