自己用java写的一个金额大小写转换的程序

面试的时候碰到过这个问题,当时只说了一下自己的思路,现在把它写下来. :P


package amountchange;

import java.math.BigDecimal;

import org.omg.CORBA.TRANSIENT;

/**
*
* @author toflyhigh
* 2008-06
*
*/
public class AmountChange2RMB {
private static String bigLetter[] = { "零", "壹", "贰", "叁", "肆", "伍", "陆",
"柒", "捌", "玖" };

private static String unit[] = { "元", "拾", "佰", "仟", "万", "拾", "佰", "仟",
"亿", "拾", "佰", "仟", "万" };

private static String unitSmall[] = { "分", "角" };

/**
*
* @param args
*/
public static void main(String[] args) {

String[] testStrs = { "1234567888888.100"/* 大十进制数 */,
"1001"/* 没有小数,且含相邻的两个零 */, "101005.1"/*零在单位所处的位置*/, "1010"/*零在元位*/ };
System.out.println(new BigDecimal(testStrs[2]).toString());
System.out.println(trans(testStrs[2]));
}

public static String trans(String str) {
BigDecimal dec = check2BigDecimal(str);
if (dec == null)
return null;

str = dec.toPlainString();
String[] sArr = str.split("\\.");
String intOnly = sArr[0];
String smallOnly = "";
if (sArr.length == 2)
smallOnly = sArr[1];

if (smallOnly.length() > 2) {
smallOnly = smallOnly.substring(0, 2);
}

return transInt(intOnly) + transSmall(smallOnly);
}

public static String transInt(String str) {
if ("0".equals(str))
return "";

StringBuffer newS = new StringBuffer();
char[] cArr = str.toCharArray();

for (int i = 0; i < cArr.length; i++) {
String u = unit[cArr.length - i - 1];
int position = "元万亿".indexOf(u);

// 遇到零,特殊处理
if (cArr[i] == '0') {
// 如果零在特殊位置上:比如个位,万位,亿位
if (position >= 0) {
// 如果零在个位:需要加上单位“元”
if (position == 0) {
newS.append(unit[cArr.length - i - 1]);
continue;
} else {// 如果零不在个位
// 零不在个位,且这个位后,紧跟着一个零:只需要加上单位
if (i < cArr.length - 1 && cArr[i + 1] == '0') {
newS.append(unit[cArr.length - i - 1]);
continue;
} else {// 零不在个位,且这个位后,没有紧跟着一个零:需要加上单位和大写数字(注意次序:单位在前,大写数字在后)
newS.append(unit[cArr.length - i - 1]);
newS.append(bigLetter[cArr[i] - 48]);
continue;
}
}
} else {// 零不在特殊位置上
// 零不在特殊位置上,且这个位后,紧跟着一个零:忽略这个零
if (i < cArr.length - 1 && cArr[i + 1] == '0') {
continue;
}
// 零不在特殊位置上,且这个位后,没有紧跟着一个零:需要加上大写数字
newS.append(bigLetter[cArr[i] - 48]);
continue;
}

}

// 不是零,常规处理
newS.append(bigLetter[cArr[i] - 48]);
newS.append(unit[cArr.length - i - 1]);

}

return newS.toString();
}

public static String transSmall(String str) {
//因为最多精确到分,所有str的长度最多位2

if (str == null || "".equals(str))
return "";

char[] cArr = str.toCharArray();
if (str.indexOf("0") == -1) {//不含有零,常规处理
StringBuffer newS = new StringBuffer();
for (int i = 0; i < cArr.length; i++) {
newS.append(bigLetter[cArr[i] - 48]);
newS.append(unitSmall[cArr.length - i - 1]);
}
return newS.toString();
} else {//含有零,分情况考虑
if (cArr[0] == '0' && cArr[cArr.length == 2 ? 1 : 0] == '0')//两个都为零
return "";
if (cArr[0] == '0' && cArr.length == 2 && cArr[1] != '0')//角位为零,分位不为零
return bigLetter[0] + bigLetter[cArr[1] - 48] + unitSmall[0];
if (cArr[0] != '0' && cArr.length == 2 && cArr[1] == '0')//分位为零,角位不为零
return bigLetter[cArr[0] - 48] + unitSmall[1];
}

return "";
}

public static BigDecimal check2BigDecimal(String str) {
try {
double f = Double.valueOf(str);// 0.0 0.1 -5 ""
if (f < 0)
System.out.println("输入数据小于0,请检查!");
return new BigDecimal(f);
} catch (NumberFormatException e) {
e.printStackTrace();
}

return null;
}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值