代码如下:
/**
* @author weigeli
*/
public class Change {
public static final String POINT = ".";
public static final Integer MAX_LENGTH = 16;
public static final Integer POINT_RIGHT_MAX_LENGTH = 2;
public static final char CHAR_ZERO = '0';
/**
* 实验项目名称:数组及字符串:金额转换,阿拉伯数字的金额转换成中国传统的形式 如:
* (¥2561011)->(贰佰伍拾陆万壹千零壹拾壹元整)输出。
* (¥2561011.56)->(贰佰伍拾陆万壹千零壹拾壹元伍角陆分)输出。 思路:实现转换
*/
public static void main(String[] args) {
Change demo = new Change();
String out;
String str1, str2;
@SuppressWarnings("resource")
Scanner input = new Scanner(System.in);
System.out.println("========请输入一个数字(可以包含两位小数)========");
String str = input.next();
// 对输入的数字进行判断,不符合要求则重新输入
boolean flag = true;
do {
if (str.contains(POINT)) {
int location = str.indexOf('.');
str1 = str.substring(0, location);
str2 = str.substring(location + 1);
if (str2.length() == 0 || str2.length() > POINT_RIGHT_MAX_LENGTH || demo.notJudgeNum(str1) || demo.notJudgeNum(str2)) {
System.out.print("您的输入含有非数字字符或不符合RMB规则,请重新输入:");
str = input.next();
} else if (demo.judge(str1) && demo.judge(str2)) {
System.out.print("您输入的数字不能全为零,请重新输入:");
str = input.next();
} else if (str1.length() > MAX_LENGTH) {
System.out.print("您输入的数字过大,请重新输入:");
str = input.next();
} else {
flag = false;
}
} else if (!str.contains(POINT)) {
if (demo.notJudgeNum(str)) {
System.out.print("您的输入包含非数字,请重新输入:");
str = input.next();
} else if (demo.judge(str)) {
System.out.print("您输入的数字不能全为零,请重新输入:");
str = input.next();
} else if (str.length() > MAX_LENGTH) {
System.out.print("您输入的数字过大,请重新输入:");
str = input.next();
} else {
flag = false;
}
}
} while (flag);
if (str.contains(POINT)) {
// ============对小数字符串换处理===================
int location = str.indexOf('.');
str1 = str.substring(0, location);
str2 = str.substring(location + 1);
out = demo.integerOutPut(str1);
out += demo.doubleOutPut(str2);
} else {
// ===========对没有小数点的字符串的处理============
out = demo.integerOutPut(str) + "整";
}
// =======输出字符串===========
System.out.println(out);
System.out.println("==============================================");
}
/**
* 对输入的字符串的整数部分进行判断,全为零则返回true
*/
public boolean judge(String str) {
boolean flag = true;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) != CHAR_ZERO) {
flag = false;
break;
}
}
return flag;
}
/**
* 对输入的字符串的整数部分进行判断,若其中包含非数字,则返回false
*/
public boolean notJudgeNum(String str) {
boolean flag = true;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) < CHAR_ZERO || str.charAt(i) > '9') {
flag = false;
break;
}
}
return !flag;
}
/**
* 整数部分的转换
*/
public String integerOutPut(String newStr) {
Change demo = new Change();
StringBuilder output = new StringBuilder();
char[] array = newStr.toCharArray();
// 对应取值和对应的单位,i代表个、十、佰、仟、万位的依次递增
for (int i = 1; i <= array.length; i++) {
// 字符数组的倒数第i位存在且这位字符不是0字符(不为零的部分)
if (array[array.length - i] != CHAR_ZERO) {
output.insert(0, demo.matching(array[array.length - i]) + demo.unit(i));
// 字符数组的倒数第i位存在且这位字符是0字符(为零的部分)
} else if (array[array.length - i] == CHAR_ZERO) {
// 对个位及以上的位置进行判断
if (i == 1 && array[array.length - i] == CHAR_ZERO) {
output.insert(0, demo.matching(array[array.length - i]) + demo.unit(i));
// 对万位及以上的位置进行判断11‘0000
} else if (i == 5 && array[array.length - i] == CHAR_ZERO) {
if (array.length >= 9 && array[array.length - 5] == CHAR_ZERO
// 如果万位到亿位之间全部都是"零",则output字符串中不存在"万"单位
&& array[array.length - 6] == CHAR_ZERO
&& array[array.length - 7] == CHAR_ZERO
&& array[array.length - 8] == CHAR_ZERO) {
output.insert(0, demo.matching(array[array.length - i]));
} else {
output.insert(0, demo.matching(array[array.length - i]) + demo.unit(i));
}
// 对亿位及以上的位置进行判断
} else if (i == 9 && array[array.length - i] == CHAR_ZERO) {
output.insert(0, demo.matching(array[array.length - i]) + demo.unit(i));
// 对万亿位及以上的位置进行判断
} else if (i == 13 && array[array.length - i] == CHAR_ZERO) {
output.insert(0, demo.matching(array[array.length - i]) + demo.unit(i));
} else {
output.insert(0, demo.matching(array[array.length - i]));
}
}
}
// -------对已经生成的字符串再做加工处理--------
for (;;) {
// 将字符串"元整"单位前面的连续"零"都去掉
if (output.charAt(output.length() - 2) == '零') {
output = new StringBuilder(output.substring(0, output.length() - 2) + output.substring(output.length() - 1));
} else if (output.charAt(0) == '零') {
// 将第一个“零”字去掉
output = new StringBuilder(output.substring(1));
} else if (output.charAt(0) == '万') {
// 将第一个“万”字去掉
output = new StringBuilder(output.substring(1));
} else if (output.charAt(0) == '亿') {
// 将第一个“亿”字去掉
output = new StringBuilder(output.substring(1));
} else if (output.toString().indexOf('万') > 0 && output.charAt(output.toString().indexOf('万') - 1) == '零') {
// 将“万”字符前面的"零"字符去掉
output = new StringBuilder(output.substring(0, output.toString().indexOf('万') - 1) + output.substring(output.toString().indexOf('万')));
} else if (output.toString().indexOf('亿') > 0 && output.charAt(output.toString().indexOf('亿') - 1) == '零') {
// 将“亿”字符前面的"零"字符去掉
output = new StringBuilder(output.substring(0, output.toString().indexOf('亿') - 1) + output.substring(output.toString().indexOf('亿')));
} else if (output.indexOf("零零") > 0) {
// 将所有的重复“零”字符替换为一个“零”
output = new StringBuilder(output.substring(0, output.indexOf("零零") + 1) + output.substring(output.indexOf("零零") + 2));
} else {
break;
}
}
return output.toString();
}
/**
* 小数点后部分的转换
*/
public String doubleOutPut(String newStr) {
String output;
char[] array = newStr.toCharArray();
Change demo = new Change();
if (array.length == POINT_RIGHT_MAX_LENGTH && array[0] == CHAR_ZERO && array[1] == CHAR_ZERO) {
output = "整";
} else if (array.length == 1 && array[0] == CHAR_ZERO) {
output = "整";
} else if (array.length == 1) {
output = demo.matching(array[0]) + "角";
} else if (array.length == POINT_RIGHT_MAX_LENGTH && array[0] != CHAR_ZERO && array[1] == CHAR_ZERO) {
output = demo.matching(array[0]) + "角";
} else if (array.length == POINT_RIGHT_MAX_LENGTH && array[0] == CHAR_ZERO) {
output = demo.matching(array[0]) + demo.matching(array[1]) + "分";
} else {
output = demo.matching(array[0]) + "角" + demo.matching(array[1]) + "分";
}
return output;
}
/**
* 参数的匹配过程
*/
public String matching(char parameter) {
String[] source = new String[]{"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
return source[parameter - CHAR_ZERO];
}
/**
* 单位
*/
public String unit(int i) {
String[] source = new String[]{"元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟"};
return source[i - 1];
}
}