最近在发现一道特别有意思的题,想把它总结出来,分享给大家。由于自己的数据结构和算法不好,只能用一些简单的思路实现,如果有大神看到,有更好的方法,希望赐教。
题目:金额转换,阿拉伯数字转换成中国传统形式。 例如:1010 0000 1010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整。
解题思路:将字符串每4个长度进行分割,因为中国的数字都是4位为一节,一个4位的数字可以转换为几千几百几十几,后面的单位就不确定了,如果这节4位数出现在1~4位,则后面添加单位是元,如果是5~8位,则单位为万,如果是9~12位,则单位为亿。
方法一:
实现代码如下:
public class Test {
// 创建一个字符串数组,用于存放1~10对应的中文字符串
private String[] strNumUper = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒",
"捌", "玖" };
// 创建字符串数组,用于存放单位
private String[] strUnit = { "拾", "佰", "仟" };
/**
* 对输入的字符串进行处理
*
* @param num
* :需要转换的字符串。
* @return 转换后的字符串
*/
private String result(String num) {
String result = "";
try {
// 处理用户输入的数字中包含有字母或者其他符合
Double.parseDouble(num);
} catch (Exception e) {
// TODO: handle exception
System.out.println(num + "不能进行转换,该" + num + "数字含有字母或者其他符号!");
return result;
}
// 将需要转换的字符串分割为
String[] strArray = new String[3];
int len = num.length();
int endIndex = len % 4 == 0 ? 4 : len % 4;
// 将需要转换的字符串进行分割,以每四个长度进行分割,比如452032010112 应该分割成4520 3201 0122
// 如果需要转换的字符串长度小于4
if (len < 5 && len > 0) {
strArray[0] = num;
return convert(strArray[0]);
} else if (len >= 5 && len < 9) {// 如果需要转换的字符串长度小于9并且大于等于5
// 计算最高位包的个数,比如532005,应该分割成53 2005,最高位只有两位
strArray[0] = num.substring(0, endIndex);
strArray[1] = num.substring(endIndex, (endIndex) + 4);
// 去掉转换后字符串中的圆整
String myriabit = convert(strArray[0]).replaceAll("圆整", "");
result += myriabit + "萬" + convert(strArray[1]);
return result;
} else if (len >= 9 && len < 13) {// //如果需要转换的字符串长度小于13并且大于等于9
strArray[0] = num.substring(0, endIndex);
strArray[1] = num.substring(endIndex, (endIndex) + 4);
strArray[2] = num.substring((endIndex) + 4, len);
// 去掉转换后字符串中的圆整
String million = convert(strArray[0]).replaceAll("圆整", "");
String myriabit = convert(strArray[1]).replaceAll("圆整", "");
result += million + "亿" + myriabit + "萬" + convert(strArray[2]);
return result;
} else {
System.out.println("对不起,你输入的字符串有误,只能输入0到999999999999位的数字");
}
return result;
}
private String convert(String numStr) {
String result = "";
int numLen = numStr.length();
for (int i = 0; i < numLen; i++) {
// 将字符转换为对应的数值
int num = numStr.charAt(i) - 48;
// 如果不是一位数或0
if (i != numLen - 1 && num != 0) {
result += strNumUper[num] + strUnit[numLen - 2 - i];
} else if (i == (numLen - 1) && num == 0) {// 如果最后一位数为0
result += "圆整";
} else if (i == (numLen - 1) && num != 0) {// 如果最后一位数不为0
result += strNumUper[num] + "圆整";
} else {
result += strNumUper[num];
}
}
result = result.replace("零零圆整", "圆整");
result = result.replace("零零", "零");
return result;
}
public static void main(String[] args) {
Test10 test = new Test10();
System.out.println(test.result("22115206321"));
System.out.println(test.result("51113210"));
System.out.println(test.result("1000"));
}
}
方法二:
public class RenMingBi {
/**
* @param args add by zxx ,Nov 29, 2008
*/
private static final char[] data = new char[]{
'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'
};
private static final char[] units = new char[]{
'元','拾','佰','仟','万','拾','佰','仟','亿'
};
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(
convert(135689123));
}
public static String convert(int money)
{
StringBuffer sbf = new StringBuffer();
int unit = 0;
while(money!=0)
{
sbf.insert(0,units[unit++]);
int number = money%10;
sbf.insert(0, data[number]);
money /= 10;
}
return sbf.toString();
}
}
希望对大家有所帮助!同时希望看到各位大神能给出更好的思路和建议。