public class Num2CHN
{
public static void main(String[] args){
try{
System.out.println(change(110111.32));
}catch(Exception e){
e.printStackTrace();
}
}

public static StringBuffer change(double num) throws Exception{
StringBuffer temp = change2CHN(getStringByNum(num));
if(temp.indexOf("圆")==-1){
temp.append("圆整");
}else{
temp.insert(temp.indexOf("圆")+2,"角");
if(temp.indexOf("圆")+4<=temp.length()){
temp.insert(temp.indexOf("圆")+4,"分");
}
temp.append("整");
}
String str = temp.toString().split("圆")[0];
int index=str.length()-1;
char[][] values = new char[3][4];
for(int i=0;i<values.length;i++){
for(int j=0;j<values[i].length;j++){
if(index>=0){
values[i][j]=str.charAt(index--);
}
}
}
return temp.replace(0,str.length(),getResult(values).toString());
} private static StringBuffer change2CHN(StringBuffer numString) throws Exception{
String temp = numString.toString();
String tempAry[] = temp.split("[.]");
if(tempAry.length>2) {
throw new Exception("not the price format!too more point");
}

if(tempAry.length>1&&tempAry[1].length()>2){
throw new Exception("not the price format!too long for cent!");
}
StringBuffer ret = new StringBuffer();
for(int i=0;i<temp.length();i++){
switch(temp.charAt(i)){
case '0' : ret.append("零");break;
case '1' : ret.append("壹");break;
case '2' : ret.append("贰");break;
case '3' : ret.append("叁");break;
case '4' : ret.append("肆");break;
case '5' : ret.append("伍");break;
case '6' : ret.append("陆");break;
case '7' : ret.append("柒");break;
case '8' : ret.append("捌");break;
case '9' : ret.append("玖");break;
case '.' : ret.append("圆");break;
case ',' : ;break;
default : throw new Exception("not the price format!");
}
}
return ret;
}
private static StringBuffer getStringByNum(double num) throws Exception{
StringBuffer _temp = new StringBuffer(num+"");
if(_temp.indexOf("E")>0){//科学计数法转换成普通计数
int point = _temp.indexOf(".");
int charE = _temp.indexOf("E");
int step = Integer.parseInt(_temp.substring(charE+1));
_temp = _temp.delete(charE,_temp.length());
_temp = _temp.deleteCharAt(point);
if(point+step>_temp.length()){
int sumIndex = point+step;
int zeroNum = sumIndex-_temp.length();
for(int i=0;i<zeroNum;i++){
_temp.insert(_temp.length(),"0");
}
}else{
_temp = _temp.insert(point+step,".");
}
}
return _temp;
}
private static StringBuffer getResult(char c[][]){
boolean f=false;
StringBuffer ret = new StringBuffer();
for(int i=0;i<c.length;i++){
if(c[i][0]!='\u0000'){
switch(i){
case 1 : ret.insert(0,"萬");break;
case 2 : ret.insert(0,"亿");break;
default : ;break;
}
}
for (int j=0;j<c[i].length ;j++ ){
if(c[i][j]=='零'){
if(f){
ret.insert(0,"零");
f=false;
}else{
continue;
}
}else if(c[i][j]!='\u0000'){
switch(j){
case 1 : ret.insert(0,"拾");break;
case 2 : ret.insert(0,"佰");break;
case 3 : ret.insert(0,"仟");break;
default : ;break;
}
ret = ret.insert(0,c[i][j]);
f=true;
}
}
}
return ret;
}
}

解决方案 »

  1.   

    看到了。一个bug,应该是没有的。谢谢
      

  2.   

    public class Num2CHN
    {
        public static void main(String[] args){
            try{
                System.out.println(change(123));
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        
        public static StringBuffer change(double num) throws Exception{
            StringBuffer temp = change2CHN(getStringByNum(num));
            System.out.println(temp);
            if(temp.indexOf("圆")==-1){
                temp.append("圆整");
            }else{
                temp.insert(temp.indexOf("圆")+2,"角");
                if(temp.indexOf("圆")+4<=temp.length()){
                    temp.insert(temp.indexOf("圆")+4,"分");
                }
                temp.append("整");
            }
            String str = temp.toString().split("圆")[0];
            int index=str.length()-1;
            char[][] values = new char[3][4];
            for(int i=0;i<values.length;i++){
                for(int j=0;j<values[i].length;j++){
                    if(index>=0){
                        values[i][j]=str.charAt(index--);
                    }
                }
            }
            return temp.replace(0,str.length(),getResult(values).toString());
        }    private static StringBuffer change2CHN(StringBuffer numString) throws Exception{
            System.out.println(numString);
            String temp = numString.toString();
            String tempAry[] = temp.split("[.]");
            if(tempAry.length>2) {
                throw new Exception("not the price format!too more point");
            }
            
            if(tempAry.length>1&&tempAry[1].length()>2){
                throw new Exception("not the price format!too long for cent!");
            }
            StringBuffer ret = new StringBuffer();
            for(int i=0;i<temp.length();i++){
                switch(temp.charAt(i)){
                    case '0' : ret.append("零");break;
                    case '1' : ret.append("壹");break;
                    case '2' : ret.append("贰");break;
                    case '3' : ret.append("叁");break;
                    case '4' : ret.append("肆");break;
                    case '5' : ret.append("伍");break;
                    case '6' : ret.append("陆");break;
                    case '7' : ret.append("柒");break;
                    case '8' : ret.append("捌");break;
                    case '9' : ret.append("玖");break;
                    case '.' : ret.append("圆");break;
                    case ',' : ;break;
                    default : throw new Exception("not the price format!");
                }
            }
            return ret;
        }
        private static StringBuffer getStringByNum(double num) throws Exception{
            StringBuffer _temp = new StringBuffer(num+"");
            if(_temp.indexOf("E")>0){//科学计数法转换成普通计数
                int point = _temp.indexOf(".");
                int charE = _temp.indexOf("E");
                int step = Integer.parseInt(_temp.substring(charE+1));
                _temp = _temp.delete(charE,_temp.length());
                _temp = _temp.deleteCharAt(point);
                if(point+step>_temp.length()){
                    int sumIndex = point+step;
                    int zeroNum = sumIndex-_temp.length();
                    for(int i=0;i<zeroNum;i++){
                        _temp.insert(_temp.length(),"0");
                    }
                }else{
                    _temp = _temp.insert(point+step,".");
                }
            }else if(num%1==0){
                _temp = new StringBuffer((int)num+"");
            }
            System.out.println(_temp);
            return _temp;    
        }
        private static StringBuffer getResult(char c[][]){
            boolean f=false;
            StringBuffer ret = new StringBuffer();
            for(int i=0;i<c.length;i++){
                if(c[i][0]!='\u0000'){
                    switch(i){
                        case 1 : ret.insert(0,"萬");break;
                        case 2 : ret.insert(0,"亿");break;
                        default : ;break;
                    }
                }
                for (int j=0;j<c[i].length ;j++ ){
                    if(c[i][j]=='零'){
                        if(f){
                            ret.insert(0,"零");
                            f=false;
                        }else{
                            continue;    
                        }
                    }else if(c[i][j]!='\u0000'){
                        switch(j){
                            case 1 : ret.insert(0,"拾");break;
                            case 2 : ret.insert(0,"佰");break;
                            case 3 : ret.insert(0,"仟");break;
                            default : ;break;
                        }
                        ret = ret.insert(0,c[i][j]);
                        f=true;
                    }
                }
            }
            return ret;
        }
    }现在没有零角这个bug了
      

  3.   

    我觉得不用判断很多逻辑,大写金额的转换本身很简单,从直觉出发,一个位置有一个单位,直接替换就好了。
    然后再加上一些规定:
    1。 零角零分的时候,要写 整
    2。不是整圆的时候,要写到 分
    这个是为了防止有人在后面续写,篡改金额。我们就当成是 规则 好了。    private static String transMoney(double money) throws Exception {
            StringBuffer rsult = new StringBuffer();
            String unit="千百十亿千百十万千百十元角分";
            String number="零壹贰叁肆伍陆柒捌玖";
            int moneyInt = (int)(money*100);
            String moneyStr = String.format("%d", moneyInt);
            int pos = unit.length() - moneyStr.length();
            boolean zero = false;
            for(int i=0;i<moneyStr.length();i++){
                if (moneyStr.charAt(i) == '0'){
                    zero = true;
                }else{
                    if (zero){
                        rsult.append(number.charAt(0));
                    }
                    zero = false;
                    rsult.append(number.charAt(moneyStr.charAt(i)-'0')).append(unit.charAt(pos+i));
                }
            }
            if ((moneyInt % 100) == 0){
                rsult.append('整');
            }else if(zero){
                rsult.append("零分");
            }
            return rsult.toString();
        }测试结果:public static void main(String[] args) throws Exception {
            double money = 1001.00;
            System.out.println(transMoney(money));  <==壹千零壹元整
            money = 1001.01;
            System.out.println(transMoney(money));  <==壹千零壹元零壹分
            money = 1001.10;
            System.out.println(transMoney(money));  <==壹千零壹元壹角零分
            money = 1011.00;
            System.out.println(transMoney(money));  <==壹千零壹十壹元整
            money = 1101.00;
            System.out.println(transMoney(money));  <==壹千壹百零壹元整
        }
      

  4.   

    int型数据处理货币会溢出,修改了一下    private static String transMoney(double money) throws Exception {
            StringBuffer rsult = new StringBuffer();
            String unit="千百十亿千百十万千百十元角分";
            String number="零壹贰叁肆伍陆柒捌玖";
            String moneyStr = String.format("%.2f", money).replace(".","");
            System.out.println(moneyStr);
            int pos = unit.length() - moneyStr.length();
            boolean zero = false;
            for(int i=0;i<moneyStr.length();i++){
                if (moneyStr.charAt(i) == '0'){
                    zero = true;
                    if(((pos+i+1)%4) == 0){
                        rsult.append(unit.charAt(pos+i));
                        zero = false;
                    }
                }else{
                    if (zero){
                        rsult.append(number.charAt(0));
                    }
                    zero = false;
                    rsult.append(number.charAt(moneyStr.charAt(i)-'0')).append(unit.charAt(pos+i));
                }
            }
            if (moneyStr.endsWith("00")){
                rsult.append('整');
            }else if(zero){
                rsult.append("零分");
            }
            return rsult.toString();
        }