金额大写转换

来源:互联网 发布:java web开发是什么 编辑:程序博客网 时间:2024/04/28 00:43

import icesnow.exception.DataConvertException;
import java.util.Arrays;
public class MoneyConvert{
 private static char[] UPPERCHAR = {'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'};
 private static char[] GROUPUNIT = {'元','万','亿','兆'};
 private static char[] INTUNIT = {'拾','佰','千'};
 private static char[] DECIUNIT = {'角','分','厘','毫'};
 private static int GROUPLENGTH = 4;
 /**
  * 金额转换为大写
  */
 public String convert(Double money){
  String[] m;
  char[] string = money.toString().toCharArray();
  int ind = StringUtil.search(string,'.');
  if(ind > -1){
   m = new char[][]{Arrays.copyOfRange(string,0,ind),Arrays.copyOfRange(string,ind + 1,string.length)};
  }else{
   m = new char[][]{string};
  }
  int intLength = m[0].length();
  if(intLength > GROUPUNIT.length * GROUPLENGTH){
   throw new DataConvertException("整数部分超出处理范围,最多支持" + GROUPUNIT.length * GROUPLENGTH + "位小数。");
  }
  int decLength = 0;
  if(m.length > 0){
   decLength = m[1].length();
   if(decLength > 4){
    throw new DataConvertException("小数部分超出处理范围,最多支持4位小数。");
   }
  }
  int gCount = Util.groupCount(intLength,GROUPLENGTH);
  char[] src = toUpperChar(m[0].toCharArray());
  char[][] tem = group(src,gCount);
  StringBuilder sb = new StringBuilder(intLength + gCount + decLength);
  if(money < 0){
   sb.append("负");
  }
  char[] mu = new char[4];
  System.arraycopy(INTUNIT,0,mu,1,3);
  for(int i = tem.length;i > 0;i--){
   mu[0] = GROUPUNIT[i - 1];
   sb.append((intUnit(tem[i - 1],mu)));
  }
  if(m.length > 1){
   char[] cs = toUpperChar(m[1].toCharArray());
   sb.append((decUnit(cs,DECIUNIT)));
  }else{
   sb.append("整");
  }
  return sb.toString();
 }
 /**
  * 添加金额单位
  */
 private char[] decUnit(char[] numb,char[] unit){
  int nl = numb.length;
  char[] c = new char[nl * 2];
  for(int i = 0;i < nl;i++){
   int pp = i * 2;
   char n = numb[i];
   if(n != '零'){
    c[pp] = n;
    c[pp + 1] = unit[i];
   }else if(i == 0){
    c[pp] = n;
   }
  }
  return StringUtil.delNullChar(c);
 }
 /**
  * 添加金额单位
  */
 private char[] intUnit(char[] numb,char[] unit){
  int nl = numb.length;
  int ul = 0;
  char[] c = new char[nl * 2];
  for(int i = nl;i > 0;i--){
   int pp = c.length - ((nl - i) * 2) - 1;
   char n = numb[i - 1];
   if(n != '零'){
    c[pp - 1] = n;
    c[pp] = unit[ul];
   }else if(i == nl){
    c[pp] = unit[ul];
   }else if(c[pp + 1] != '零' && c[pp + 1] != 0){
    c[pp] = n;
   }
   ++ul;
  }
  return StringUtil.delNullChar(c);
 }
 /**
  * 数字转大写
  */
 private char[] toUpperChar(char[] chars){
  for(int i = 0;i < chars.length;i++){
   chars[i] = UPPERCHAR[chars[i] - '0'];
  }
  return chars;
 }
 /**
  * 对数据进行分组
  */
 private char[][] group(char[] chars,int glen){
  int length = chars.length;
  int s = length - GROUPLENGTH, e = length;
  char[][] tem = new char[glen][];
  for(int i = 0;i < glen;i++){
   tem[i] = Arrays.copyOfRange(chars,s,e);
   if(s - GROUPLENGTH < 0){
    e = s;
    s = 0;
   }else{
    s -= GROUPLENGTH;
    e -= GROUPLENGTH;
   }
  }
  return tem;
 }
 public static void main(String[] args){
  MoneyConvert moneyConvert = new MoneyConvert();
  long time = System.currentTimeMillis();
  for(int i = 0;i < 1000;i++){
   moneyConvert.convert(8658542.003);
  }
  time = System.currentTimeMillis() - time;
  System.out.println(time);// 15 , 31
 }
}
0 0
原创粉丝点击