在与财务相关的应用中,经常会用到人民币金额的大写,比如发票的打印程序。 本题的任务是:从键盘输入一个十亿以内的正整数(int类型),把它转换为人民币金额大写(不考虑用户输入错误的情况)。
比如,用户输入:35201,程序输出:叁万伍仟贰佰零壹 用户输入:30201,程序输出:叁万零贰佰零壹 用户输入:30001,程序输出:叁万零壹 用户输入:31000,程序输出:叁万壹仟
用户输入:120023201,程序输出:壹亿贰仟零贰万叁仟贰佰零壹 用户输入:120020001,程序输出:壹亿贰仟零贰万零壹 用户输入:100000001,程序输出:壹亿零壹
比如,用户输入:35201,程序输出:叁万伍仟贰佰零壹 用户输入:30201,程序输出:叁万零贰佰零壹 用户输入:30001,程序输出:叁万零壹 用户输入:31000,程序输出:叁万壹仟
用户输入:120023201,程序输出:壹亿贰仟零贰万叁仟贰佰零壹 用户输入:120020001,程序输出:壹亿贰仟零贰万零壹 用户输入:100000001,程序输出:壹亿零壹
可以看到,在万后满千位,则不加零,否则要补零,但不要出现类似“零零”的情况。 在亿后满千万位,则不加零,否则要补零,但整个“万档”没有数字时,“万”字省去。
package MyTest;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class MyTest {
public static void main(String[] args) throws Exception {
String[] multipleText = { "", "万", "亿" };
String number = "121000";
int length = number.length();
List<String> list=new ArrayList<String>();
while (length > 0) {
if (length <= 4)
list.add(number.substring(0, length));
else
list.add(number.substring(length - 4, length));
length -= 4;
}
Stack<String> stack=new Stack<String>();
for (int i = 0; i < list.size(); i++) {
String temp=NumberToChinese(list.get(i));
if(!"".equals(temp))
stack.push(temp+multipleText[i]);
}
while(!stack.isEmpty()){
System.out.print(stack.pop());
}
}
/**
* @param number
* 数字字符串
* @return 汉字字符串
*/
public static String NumberToChinese(String number) {
// 用于统计0个数
int zeroCount = 0;
// String[] numberText = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
String[] numberText = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
String[] multipleText = { "仟", "佰", "拾", "" };
int digitNumber = number.length();
String temp = "";
for (int i = 0; i < digitNumber; i++) {
// 如果当前数字不为0
if ((number.charAt(i) - '0') != 0) {
String temp1 = "";
// number为两位数并且number的十位必须是1
if (digitNumber == 2 && (number.charAt(i) - '0') == 1) {
if (i == 1)
temp1 = numberText[(number.charAt(i) - '0')];
} else {
// 将数字转换为汉字
temp1 = numberText[(number.charAt(i) - '0')];
}
// 获取当前汉字的倍数
String temp2 = multipleText[(multipleText.length - digitNumber) + i];
// 将汉字数字与倍数合并
temp += temp1 + temp2;
// 遇到非零数字重置为0
zeroCount = 0;
} else {
// 遇到零数字则统计
if (zeroCount == 0) {
temp += "零";
zeroCount++;
}
}
}
// digitNumber!=1表示总长度为1位就不给删除
if (zeroCount != 0 && digitNumber != 1) {
// 如果最后末尾有零,则将汉字零删除
return temp.substring(0, temp.lastIndexOf("零"));
} else {
return temp;
}
}
}