该算法的效率和性能较好
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
}
}