金额数字转中文大写(转)

处理能力:
整数部分:9999999999999999(16位长,仟万亿)
小数部分:3位,多于3位舍去(不做四舍五入)

运行结果:
1.23 壹元贰角叁分
1234567890123456.123 壹仟贰佰叁拾肆万伍仟陆佰柒拾捌亿玖仟零壹拾贰万叁仟肆佰伍拾陆元壹角贰分叁厘
0.0798 柒分玖厘
10,001,000.09 壹仟万零壹仟元玖分
01.107700 壹元壹角柒厘

public   class  MoneyUtil {

  
/**  大写数字  */
  
private   static   final  String[] NUMBERS  =  {  " " " " " " " " " " " " " " ,
      
" " " " " "  };
  
/**  整数部分的单位  */
  
private   static   final  String[] IUNIT  =  {  " " " " " " " " " " " " " " ,
      
" " " 亿 " " " " " " " " " " " " " " "  };
  
/**  小数部分的单位  */
  
private   static   final  String[] DUNIT  =  {  " " " " " "  };

  
/**
   * 得到大写金额。
   
*/
  
public   static  String toChinese(String str) {
    str 
=  str.replaceAll( " , " "" ); //  去掉","
    String integerStr; //  整数部分数字
    String decimalStr; //  小数部分数字

    
//  初始化:分离整数部分和小数部分
     if  (str.indexOf( " . " >   0 ) {
      integerStr 
=  str.substring( 0 , str.indexOf( " . " ));
      decimalStr 
=  str.substring(str.indexOf( " . " +   1 );
    } 
else   if  (str.indexOf( " . " ==   0 ) {
      integerStr 
=   "" ;
      decimalStr 
=  str.substring( 1 );
    } 
else  {
      integerStr 
=  str;
      decimalStr 
=   "" ;
    }
    
//  integerStr去掉首0,不必去掉decimalStr的尾0(超出部分舍去)
     if  ( ! integerStr.equals( "" )) {
      integerStr 
=  Long.toString(Long.parseLong(integerStr));
      
if  (integerStr.equals( " 0 " )) {
        integerStr 
=   "" ;
      }
    }
    
//  overflow超出处理能力,直接返回
     if  (integerStr.length()  >  IUNIT.length) {
      System.out.println(str 
+   " :超出处理能力 " );
      
return  str;
    }

    
int [] integers  =  toArray(integerStr); //  整数部分数字
     boolean  isMust5  =  isMust5(integerStr); //  设置万单位
     int [] decimals  =  toArray(decimalStr); //  小数部分数字
     return  getChineseInteger(integers, isMust5)  +  getChineseDecimal(decimals);
  }

  
/**
   * 整数部分和小数部分转换为数组,从高位至低位
   
*/
  
private   static   int [] toArray(String number) {
    
int [] array  =   new   int [number.length()];
    
for  ( int  i  =   0 ; i  <  number.length(); i ++ ) {
      array[i] 
=  Integer.parseInt(number.substring(i, i  +   1 ));
    }
    
return  array;
  }

  
/**
   * 得到中文金额的整数部分。
   
*/
  
private   static  String getChineseInteger( int [] integers,  boolean  isMust5) {
    StringBuffer chineseInteger 
=   new  StringBuffer( "" );
    
int  length  =  integers.length;
    
for  ( int  i  =   0 ; i  <  length; i ++ ) {
      
//  0出现在关键位置:1234(万)5678(亿)9012(万)3456(元)
      
//  特殊情况:10(拾元、壹拾元、壹拾万元、拾万元)
      String key  =   "" ;
      
if  (integers[i]  ==   0 ) {
        
if  ((length  -  i)  ==   13 ) //  万(亿)(必填)
          key  =  IUNIT[ 4 ];
        
else   if  ((length  -  i)  ==   9 ) //  亿(必填)
          key  =  IUNIT[ 8 ];
        
else   if  ((length  -  i)  ==   5   &&  isMust5) //  万(不必填)
          key  =  IUNIT[ 4 ];
        
else   if  ((length  -  i)  ==   1 ) //  元(必填)
          key  =  IUNIT[ 0 ];
        
//  0遇非0时补零,不包含最后一位
         if  ((length  -  i)  >   1   &&  integers[i  +   1 !=   0 )
          key 
+=  NUMBERS[ 0 ];
      }
      chineseInteger.append(integers[i] 
==   0   ?  key
          : (NUMBERS[integers[i]] 
+  IUNIT[length  -  i  -   1 ]));
    }
    
return  chineseInteger.toString();
  }

  
/**
   * 得到中文金额的小数部分。
   
*/
  
private   static  String getChineseDecimal( int [] decimals) {
    StringBuffer chineseDecimal 
=   new  StringBuffer( "" );
    
for  ( int  i  =   0 ; i  <  decimals.length; i ++ ) {
      
//  舍去3位小数之后的
       if  (i  ==   3 )
        
break ;
      chineseDecimal.append(decimals[i] 
==   0   ?   ""
          : (NUMBERS[decimals[i]] 
+  DUNIT[i]));
    }
    
return  chineseDecimal.toString();
  }

  
/**
   * 判断第5位数字的单位"万"是否应加。
   
*/
  
private   static   boolean  isMust5(String integerStr) {
    
int  length  =  integerStr.length();
    
if  (length  >   4 ) {
      String subInteger 
=   "" ;
      
if  (length  >   8 ) {
        
//  取得从低位数,第5到第8位的字串
        subInteger  =  integerStr.substring(length  -   8 , length  -   4 );
      } 
else  {
        subInteger 
=  integerStr.substring( 0 , length  -   4 );
      }
      
return  Integer.parseInt(subInteger)  >   0 ;
    } 
else  {
      
return   false ;
    }
  }

  
public   static   void  main(String[] args) {
    String number 
=   " 1.23 " ;
    System.out.println(number 
+   "   "   +  MoneyUtil.toChinese(number));
    number 
=   " 1234567890123456.123 " ;
    System.out.println(number 
+   "   "   +  MoneyUtil.toChinese(number));
    number 
=   " 0.0798 " ;
    System.out.println(number 
+   "   "   +  MoneyUtil.toChinese(number));
    number 
=   " 10,001,000.09 " ;
    System.out.println(number 
+   "   "   +  MoneyUtil.toChinese(number));
    number 
=   " 01.107700 " ;
    System.out.println(number 
+   "   "   +  MoneyUtil.toChinese(number));
  }

}

原文出自 http://www.blogjava.net/fastunit/archive/2008/03/25/188537.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值