梦相随1006

版权归 梦相随1006 所有,未经 https://www.cnblogs.com/xin1006 作者许可,严禁转载

导航

人民币处理问题(原创)

1, 人民币小写转为大写

  private static Map<Integer,String> map2UpperWeight =null;
    
    static{
        map2UpperWeight=new HashMap<Integer,String>();
        map2UpperWeight.put(0, "分");
        map2UpperWeight.put(1, "角");
        map2UpperWeight.put(2, "元");
        map2UpperWeight.put(3, "拾");
        map2UpperWeight.put(4, "佰");
        map2UpperWeight.put(5, "仟");
        map2UpperWeight.put(6, "万");
        map2UpperWeight.put(7, "拾");
        map2UpperWeight.put(8, "佰");
        map2UpperWeight.put(9, "仟");
        map2UpperWeight.put(10, "亿");
        map2UpperWeight.put(11, "拾");
        map2UpperWeight.put(12, "佰");
        map2UpperWeight.put(13, "仟");
    
    }
  /**
     * yangw
     * 小写金额转换为大写金额
     * 123,344.60-->壹拾贰万叁仟叁佰肆拾肆元陆角.
     */
    public static String toUpperMoney(String str){
        //1,倒序
        str=str.replaceAll("\\.", "").replaceAll(",", ""); 
        str=new StringBuffer(str).reverse().toString();
        
        // 是否是零
        boolean isZero=false;
        //是否是末尾零
        boolean isLastZero=false;
        //结果buffer
        StringBuffer result=new StringBuffer();
        //循环迭代
        for(int i=0;i<str.length();i++){
            char ch=str.charAt(i);
            
            //检查零
            if(ch=='0'){
                //如果result中没有任何字符,那么这个零玖拾末尾零
                if(result.length()==0)isLastZero=true;
                isZero=true;
                continue;
            }else{
                
                if(isZero){ //有零时,应该加入零
                    isZero=false;
                    if(isLastZero){ //末尾零不加入
                        isLastZero=false;
                    }else{
                        result.append("零");
                    }    
                }
                if(i>2){
                    if(result.indexOf("元")==-1){
                        result.append("元");
                    }
                }
                //先加入权重
                if(i>6&&i<10){ //可能需要加入 "万"
                    if(result.indexOf("万")==-1){
                        result.append("万");
                    }
                }else if(i>10){
                    if(result.indexOf("亿")==-1){
                        result.append("亿");
                    }
                }
                result.append(map2UpperWeight.get(i));
                switch (ch) {
                        
                    case '1':
                        result.append("壹");
                    break;
                    case '2':
                        result.append("贰");
                        break;
                    case '3':
                        result.append("叁");
                        break;
                    case '4':
                        result.append("肆");
                        break;
                    case '5':
                        result.append("伍");
                        break;
                    case '6':
                        result.append("陆");
                        break;
                    case '7':
                        result.append("柒");
                        break;
                    case '8':
                        result.append("捌");
                        break;
                    case '9':
                        result.append("玖");
                        break;
                    default:
                    break;
                }
                
            }    
        }
        //是否加入整
        String temp=result.toString();
        if(!(temp.startsWith("角") || temp.startsWith("分")))
            result.insert(0, "整");
        
        return result.reverse().toString();
    }
    

2, 其他人民币的处理

/**
     * yangw
     * 处理金额字段(去掉小数点,如果是人民币最后两位是角分)
     * 123,344.60-->000012334460
     * @param str
     * @return
     */
    public static String preAmount(String str){
        //1,确定小数点的位置
        int len=str.length();
        int index=str.indexOf(".");
        //2,小数点后面有几位
        if(index==-1){
            str+="00";
        }else if(len-index-1==1){
            str+="0";
        }
        //去掉小数点,去掉逗号
        str=str.replaceAll("\\.", "").replaceAll(",", ""); 
        str=StringUtil.fillChar(str, '0', 12, true);
        
        return str;
    }

    /**
     * yangw
     * 还原真实的金额,(即加入小数点,去掉前面补的零) 
     * 比如 :000003452312-->34523.12
     */
    public static String restoreAmount(String str){
        //1, 去掉前面的零
        Pattern pat = Pattern.compile("^0+");  
        Matcher mat = pat.matcher(str);  
        if( mat.find()){
            str=mat.replaceFirst("");
        }
        if("".equals(str)){
            str="0";
        }
        
        //2,加入小数点, 办法(数字乘以0.01)
        double temp=Double.parseDouble(str);
        if(temp==0) return "0.00";
        double result=temp*0.01;
        
        //3,格式化数字 为两位小数
        //#.00 表示两位小数 #.0000四位小数 以此类推...
        DecimalFormat df =new DecimalFormat("#.00");  
        df.format(result);
        return df.format(result);
    }
    
    /**
     * yangw
     * 真实的金额(含有千分位),(即加入小数点,去掉前面补的零,并且加入千分位) 
     * 比如 :000003452312-->34,523.12
     */
    public static String thousandsAmount(String str){
        //先去掉前面的零和加入小数点
        str=restoreAmount(str); 
        //123.45 这样的数字不需要处理
        if(str.length()<7) return str;
        //小数点取前面部分和后面部分
        String preStr=str.substring(0, str.length()-3);
        String lastStr=str.substring(str.length()-3);
        //为前面部分的数字加入千分位
        StringBuffer sb=new StringBuffer();
        //i表示当前子串的开始位置,j表示当前子串的结束位置
        int j=preStr.length();
        for(int i=preStr.length()-3;i>0;j=i,i-=3){
            sb.insert(0, ","+preStr.substring(i, j));//插入最前面
        }
        sb.insert(0,preStr.substring(0,j));//(0,j)最后一次的需要额外加入
        sb.append(lastStr);
        return sb.toString();
    }

 

 

 

============================2018年新版本人民币金额大小写转换功能Java实现========================================

 

  1 package hulk.yangw.support;
  2 
  3 import java.math.BigDecimal;
  4 import java.math.BigInteger;
  5 import java.text.DecimalFormat;
  6 import java.text.ParseException;
  7 import java.util.HashMap;
  8 import java.util.Map;
  9 
 10 /**
 11  * 金额工具类
 12  * @author yangw
 13  * @date   2018-07-05
 14  */
 15 public class MoneyUtil {
 16 
 17     /**
 18      * 默认格式
 19      */
 20     static String DEFAULT_PATTERN = ",###,##0.00";
 21     
 22     
 23     private static Map<Integer,Character> map2UpperWeight =null;
 24     
 25     static{
 26         map2UpperWeight=new HashMap<Integer,Character>();
 27         map2UpperWeight.put(0, '分');
 28         map2UpperWeight.put(1, '角');
 29         map2UpperWeight.put(2, '元');
 30         map2UpperWeight.put(3, '拾');
 31         map2UpperWeight.put(4, '佰');
 32         map2UpperWeight.put(5, '仟');
 33         map2UpperWeight.put(6, '万');
 34         map2UpperWeight.put(7, '拾');
 35         map2UpperWeight.put(8, '佰');
 36         map2UpperWeight.put(9, '仟');
 37         map2UpperWeight.put(10, '亿');
 38         map2UpperWeight.put(11, '拾');
 39         map2UpperWeight.put(12, '佰');
 40         map2UpperWeight.put(13, '仟');
 41         map2UpperWeight.put(14, '万');
 42         map2UpperWeight.put(15, '拾');
 43         map2UpperWeight.put(16, '佰');
 44         map2UpperWeight.put(17, '仟');
 45         
 46     }
 47     
 48     /**
 49      * 金额转换为千分位显示的金额值
 50      * @param srcMoney 传入的金额
 51      * @return
 52      */
 53     public static String toThousands(Object srcMoney ){
 54         Double money = toNumber(srcMoney);
 55         return toThousands(money,DEFAULT_PATTERN);
 56     }
 57 
 58     /**
 59      * 对象转为Double值
 60      * @param srcMoney
 61      * @return
 62      */
 63     private static Double toNumber(Object srcMoney){
 64         
 65         
 66         if(srcMoney == null) return null;
 67         if(srcMoney instanceof String){
 68             String temp = ((String) srcMoney).replaceAll(",", "");
 69             return Double.parseDouble(temp);
 70         }else if(srcMoney instanceof Integer){
 71             return (Integer)srcMoney*1.0;
 72         }else if(srcMoney instanceof BigDecimal){
 73             return ((BigDecimal)srcMoney).doubleValue();
 74         }else if(srcMoney instanceof BigInteger){
 75             return ((BigInteger)srcMoney).doubleValue();
 76         }else{
 77             return (Double)srcMoney;
 78         }
 79         
 80     }
 81     /**
 82      * 金额格式化显示
 83      * @param srcMoney 传入的金额
 84      * @param pattern 格式化串
 85      * @return
 86      */
 87     public static String toThousands(Object srcMoney,String pattern){
 88         Double money = toNumber(srcMoney);
 89         DecimalFormat df=new DecimalFormat(pattern); 
 90         //df.setRoundingMode(RoundingMode.FLOOR); //设置舍入方式
 91         return df.format(money);
 92     }
 93     
 94     /**
 95      * 千分位数字解析为普通数字显示
 96      * @param srcMoney 传入的千分位金额
 97      * @param pattern 格式化串
 98      * @return
 99      * @throws ParseException 
100      */
101     public static Double toNumeric(String srcMoney ,String pattern) throws Exception{
102         
103         DecimalFormat df=new DecimalFormat(pattern);
104         return df.parse(srcMoney).doubleValue();
105     }
106     
107     /**
108      * 千分位数字解析为普通数字显示
109      * @param srcMoney 传入的千分位金额
110      * @throws ParseException 
111      */
112     public static Double toNumeric(String srcMoney) throws Exception{
113         
114         return toNumeric(srcMoney,DEFAULT_PATTERN);
115     }
116     
117     /**
118      * 小写金额转换为大写金额
119      * 如:123,344.60-->壹拾贰万叁仟叁佰肆拾肆元陆角.
120      */
121     public static String toUpperMoney(Object srcMoney){
122         //1, 将传入的对象格式化为标准的千分位形式
123         String money = toThousands(srcMoney);    
124         
125         //2,倒序
126         money=money.replaceAll("\\.", "").replaceAll(",", ""); 
127         money=new StringBuffer(money).reverse().toString();
128         
129         // 是否是零
130         boolean isZero=false;
131         //是否是末尾零
132         boolean isLastZero=false;
133         //结果buffer
134         StringBuffer result=new StringBuffer();
135         //循环迭代
136         for(int i=0;i<money.length();i++){
137             char ch=money.charAt(i);
138             
139             //检查零
140             if(ch=='0'){
141                 //如果result中没有任何字符,那么这个零就是末尾零
142                 if(result.length()==0)isLastZero=true;
143                 isZero=true;
144                 continue;
145             }else{
146                 
147                 if(isZero){ //有零时,应该加入零
148                     isZero=false;
149                     if(isLastZero){ //末尾零不加入
150                         isLastZero=false;
151                     }else{
152                         result.append('零');
153                     }    
154                 }
155                 if(i>2){
156                     if(result.indexOf("元")==-1){
157                         result.append('元');
158                     }
159                 }
160                 //先加入权重
161                 if(i>6&&i<10){ //可能需要加入 "万"
162                     if(result.indexOf("万")==-1){
163                         result.append('万');
164                     }
165                 }else if(i>10){
166                     if(result.indexOf("亿")==-1){
167                         result.append('亿');
168                     }
169                 }
170                 result.append(map2UpperWeight.get(i));
171                 switch (ch) {
172                         
173                     case '1':
174                         result.append('壹');
175                     break;
176                     case '2':
177                         result.append('贰');
178                         break;
179                     case '3':
180                         result.append('叁');
181                         break;
182                     case '4':
183                         result.append('肆');
184                         break;
185                     case '5':
186                         result.append('伍');
187                         break;
188                     case '6':
189                         result.append('陆');
190                         break;
191                     case '7':
192                         result.append('柒');
193                         break;
194                     case '8':
195                         result.append('捌');
196                         break;
197                     case '9':
198                         result.append('玖');
199                         break;
200                     default:
201                     break;
202                 }
203                 
204             }    
205         }
206         //是否加入整
207         String temp=result.toString();
208         if(!(temp.startsWith("角") || temp.startsWith("分")))
209             result.insert(0, '整');
210         
211         return result.reverse().toString();
212     }
213     
214     
215     /**
216      * 大写金额转为小写金额<br/>
217      * 完全使用Double因为精度问题,会出现 12131.45 --> 12131.449999999999,故改为用BigDecimal<br/>
218      * 遇到百亿的数值会转为负数问题 ,所以大数字运算需要使用BigDecimal函数<br/>
219      * 解决万亿的问题
220      */
221     public static Double toLowerMoney(String srcMoney){
222     
223         int currTextNum = 0;    //当前取到的值
224         int tempResult = 0;        //临时结果(当遇到万 亿时临时结果清零)
225         int tempCount = 0;         //临时结果清零的次数
226         int weight = 0;         //连续权重的次数,遇到数字该值清零
227         
228         BigDecimal result = new BigDecimal(0);    //最终结果
229         
230          for(int i=0;i<srcMoney.length();i++){
231              char ch=srcMoney.charAt(i);
232              switch(ch){
233              case '壹':
234                  currTextNum = 1;
235                  weight = 0;
236                  break;
237              case '贰':
238                  currTextNum = 2;
239                  weight = 0;
240                  break;
241              case '叁':
242                  currTextNum = 3;
243                  weight = 0;
244                  break;
245              case '肆':
246                  currTextNum = 4;
247                  weight = 0;
248                  break;
249              case '伍':
250                  currTextNum = 5;
251                  weight = 0;
252                  break;
253              case '陆':
254                  currTextNum = 6;
255                  weight = 0;
256                  break;
257              case '柒':
258                  currTextNum = 7;
259                  weight = 0;
260                  break;
261              case '捌':
262                  currTextNum = 8;
263                  weight = 0;
264                  break;
265              case '玖':
266                  currTextNum = 9;
267                  weight = 0;
268                  break;  
269              case '分':
270                  result = result.add(new BigDecimal(currTextNum).multiply(new BigDecimal(0.01)));
271                 break;
272              case '角':
273                  result = result.add(new BigDecimal(currTextNum).multiply(new BigDecimal(0.1)));
274                  break;
275              case '元':
276                  weight++;
277                  if(weight<=1){ // 如 1234
278                      result = result.add(new BigDecimal(currTextNum));
279                  }
280                  result = result.add(new BigDecimal(tempResult));
281                  currTextNum = 0;
282                  
283                  break;
284              case '拾':
285                  tempResult += currTextNum*10;
286                  weight++;
287                  break;
288              case '佰':
289                  tempResult += currTextNum*100;
290                  weight++;
291                  break;
292              case '仟':
293                  tempResult += currTextNum*1000;
294                  weight++;
295                  break;
296              case '万':
297                  tempCount++;
298                  weight++;
299                  BigDecimal bd_wan = new BigDecimal(10000);    //若直接用 *10000会出现超过精度而产生无法预估的数字
300                  if(weight>1){
301                      if(tempCount==1){    //说明首次遇到万
302                          result = new BigDecimal(tempResult).multiply(bd_wan);
303                      }else{
304                  
305                         result = result.add(new BigDecimal(tempResult).multiply(bd_wan));
306                      }
307                  }else{
308                      if(tempCount==1){    //说明首次遇到万
309                          result = new BigDecimal(currTextNum+tempResult).multiply(bd_wan);
310                      }else{
311                          result = result.add(new BigDecimal(currTextNum+tempResult).multiply(bd_wan));
312                      }
313                  }
314                 
315                  tempResult =0;
316                  currTextNum = 0;
317                  break;
318              case '亿':
319                  tempCount++;
320                  weight++;
321                  BigDecimal bd_yi = new BigDecimal(100000000);    //若直接用 *100000000会出现超过精度而产生无法预估的数字
322                  if(weight>1){    //说明有类似百万这样形式的数据产生
323                      if(tempCount==1){    //说明首次遇到亿
324                          result = new BigDecimal(tempResult).multiply(bd_yi);
325                      }else{ 
326                          //解决万亿以上问题的写法
327                          result = new BigDecimal(tempResult).add(result).multiply(bd_yi);
328                      }
329                  }else{
330                      if(tempCount==1){    //说明首次遇到亿
331                          result = new BigDecimal(currTextNum+tempResult).multiply(bd_yi);
332                      }else{
333                         //result = result.add(new BigDecimal(currTextNum+tempResult).multiply(bd_yi));
334                         //解决万亿以上问题的写法
335                          result = new BigDecimal(tempResult+currTextNum).add(result).multiply(bd_yi);
336                      }
337                  }
338                  
339                  tempResult = 0;
340                  currTextNum = 0;
341                  break;
342              case '整':
343              case '零':
344                  weight = 0;
345                  break;
346              default:
347                  System.out.println("无效字符:"+ch);
348              }
349          }
350          
351         return result.doubleValue();
352     }
353     
354     
355    
356     public static void main(String[] args) throws Exception{
357         
358         String number = "10239400.00";
359         String upper = toUpperMoney(number);
360         System.out.println(number+"-->upper:" + upper);
361         System.out.println("lower:" + toThousands(toLowerMoney(upper)));
362     }
363     
364 }

 

posted on 2014-01-17 11:22  梦相随1006  阅读(240)  评论(0编辑  收藏  举报