递归实现会计金额大小写转换



import java.text.DecimalFormat;
import java.text.NumberFormat;


public class MoneyUtils {
/**
* 中文中繁写的汉字金额 经常使用
*/
public static String[] upperNums = new String[] { "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖", "零","整","正" };
/**
* 与汉字相应的转化的数字
*/
public static int[] lowerNums = new int[] { 1, 2, 3, 4, 5, 6, 7,8, 9, 0 ,0,0};
/**
* 倍数关键词 简写 注意:一定要由大到小
*/
public static String[] rmbMult = new String[] { "亿", "万", "仟", "佰", "拾","元","圆","整","正","角","分" };
/**
* 与倍数关键词对应的倍数
*/
public static double[] toMult = new double[] { 100000000, 10000, 1000, 100,10,1,1,1,1,0.1,0.01 };

public static String negative = "(负数)";

public static double toLower(String amountInWords){
int ispositive = 1;
if(amountInWords.indexOf(negative)>=0){
ispositive = -1;
amountInWords = amountInWords.replace(negative, "");
}
double amountInFigures = 0;
if(amountInWords.length() == 1){
return getLowerNum(amountInWords);
}
else if(amountInWords.length() == 2 && amountInWords.substring(0,1).equals(upperNums[9])){
return getLowerNum(amountInWords.substring(1,2));
}else{
for (int i = 0; i < rmbMult.length; i++) {
int index = amountInWords.lastIndexOf(rmbMult[i]);
if (index >= 0) {
String storeMult = amountInWords.substring(0, index);
amountInWords = amountInWords.substring(index + 1);
amountInFigures = toLower(storeMult)*toMult[i] + toLower(amountInWords);
break;
}
}
}
return amountInFigures*ispositive;
}

private static double getLowerNum(String upperNum){
for (int j = 0; j < upperNums.length; j++) {
if(upperNum.equals(upperNums[j])){
return lowerNums[j];
}
}
return 0;
}

public static String toUpper(String amountInFiguresStr){
String amountInWords = "";
String integerPart = amountInFiguresStr;
String decimalPart = "";
int indexOfDot = amountInFiguresStr.indexOf('.');
if(indexOfDot >= 0){
integerPart = amountInFiguresStr.substring(0,indexOfDot);
if(amountInFiguresStr.length() - 1 > indexOfDot){
decimalPart = amountInFiguresStr.substring(indexOfDot+1);
}
}
double tempPrice = 0;
try {
tempPrice = Double.parseDouble(amountInFiguresStr);
} catch (NumberFormatException e) {
tempPrice = 0;
}
if(tempPrice == 0){ //如果输入的是0或者无法转成double时,设为0
amountInWords = upperNums[9]; //零
}else{
if(!integerPart.equals("")){
long integerNum = Long.parseLong(integerPart);
if(tempPrice < 0){
amountInWords = negative;
}
if(integerNum != 0){
amountInWords += intToUpper(Math.abs(integerNum));
amountInWords += rmbMult[5]; //元
}
}
if(decimalPart.equals("") || Integer.parseInt(decimalPart) == 0){
amountInWords += rmbMult[7]; //整
}else{
amountInWords += getUpperNum(Integer.parseInt(decimalPart.substring(0,1)));
if(!decimalPart.substring(0,1).equals("0")){
amountInWords += rmbMult[9]; //角
}
if(decimalPart.length() > 1 && !decimalPart.substring(1,2).equals("0")){
amountInWords += getUpperNum(Integer.parseInt(decimalPart.substring(1,2))) + rmbMult[10]; //分
}
}
}
return amountInWords;
}

private static String intToUpper(long amountInFigures){
if(amountInFigures == 0){
return "";
}
else if(amountInFigures < 10){
return getUpperNum((int)amountInFigures);
}else{
String amountInWords = "";
for(int i=0;i<toMult.length - 2;i++){
int divisor =(int)(amountInFigures / (long)toMult[i]);
long mod = amountInFigures % (long)toMult[i];
if(divisor > 0){
amountInWords += intToUpper(divisor) + rmbMult[i];
if(0 < mod && mod < (long)toMult[i]/10){
amountInWords += upperNums[9];
}
amountInWords += intToUpper(mod);
break;
}
}
return amountInWords;
}
}

private static String getUpperNum(int lowerNum){
for(int i=0;i<lowerNums.length;i++){
if(lowerNum == lowerNums[i]){
return upperNums[i];
}
}
return upperNums[9]; //零
}

public static void main(String[] args){
String amountInFiguresStr = "-124500002.43";
String amountInWords = toUpper(amountInFiguresStr);
System.out.println(amountInWords);
double amountInFigures = toLower(amountInWords);
NumberFormat formatter = new DecimalFormat("0.00");
System.out.println(formatter.format(amountInFigures));
}
}




如果有错误,希望大家能够给我指出来,谢谢
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值