分级分段的金额转中文大写的方法

import java.text.NumberFormat;
import java.text.DecimalFormat;

//总体思路:
//对数字进行分级处理,级长为4
//对分级后的每级分别处理,处理后得到字符串相连
//如:123456=12|3456
//第二级:12=壹拾贰 + “万”
//第一级:3456 =叁千肆百伍拾陆 + “”

public final class RMB {
  private double amount = 0.0D;
  private static final String NUM = "零壹贰叁肆伍陆柒捌玖";
  private static final String UNIT = "仟佰拾个";
  private static final String GRADEUNIT = "仟万亿兆";
  private static final String DOTUNIT = "角分厘";
  private static final int GRADE = 4;
  private static final String SIGN = "¥";
  private static final NumberFormat nf = new DecimalFormat("#0.###");
  public RMB(double amount) {
    this.amount = amount;
  }

  public String toBigAmt(){
    return toBigAmt(this.amount);
  }
  public static String toBigAmt(double amount){
    String amt = nf.format(amount);
    Double d = new Double(amount);
    String dotPart = ""; //取小数位
    String intPart = ""; //取整数位
    int dotPos;

    if ( (dotPos = amt.indexOf('.')) != -1) {
      intPart = amt.substring(0, dotPos);
      dotPart = amt.substring(dotPos + 1);
    }
    else {
      intPart = amt;
    }
    if(intPart.length() > 16) throw new java.lang.InternalError("The amount is too big.");
    String intBig = intToBig(intPart);
    String dotBig = dotToBig(dotPart);
    if(dotBig.length() == 0) return intBig +"元整";
    else return intBig + "元" + dotBig;
  }
  private static String dotToBig(String dotPart){
      //得到转换后的大写(小数部分)
    String strRet = "";
    for(int i=0; i<dotPart.length() && i<3; i++){
      int num;
      if((num = Integer.parseInt(dotPart.substring(i,i+1))) != 0)
        strRet += NUM.substring(num,num+1) + DOTUNIT.substring(i,i+1);
    }
    return strRet;
  }

  private static String intToBig(String intPart){
      //得到转换后的大写(整数部分)
      int grade; //级长
      String result = "";
      String strTmp = "";

      //得到当级长
      grade = intPart.length() / GRADE;
      //调整级次长度
      if(intPart.length() % GRADE != 0) grade += 1;

      //对每级数字处理
      for(int i = grade; i >= 1; i--){
          strTmp = getNowGradeVal(intPart, i);//取得当前级次数字
          result += getSubUnit(strTmp);//转换大写
          result = dropZero(result);//除零
          //加级次单位
          if( i>1 ) //末位不加单位
              //单位不能相连续
              result += GRADEUNIT.substring(i-1,i);
      }
      return result;
  }
  private static String getNowGradeVal(String strVal,int grade){
      //得到当前级次的串
      String rst;
      if(strVal.length() <= grade * GRADE)
          rst = strVal.substring(0,strVal.length() - (grade-1)*GRADE);
      else
          rst = strVal.substring(strVal.length() - grade*GRADE,strVal.length() - (grade-1)*GRADE);
      return rst;
  }

  private static String getSubUnit(String strVal){
      //数值转换
      String rst = "";

      for(int i = 0;i< strVal.length(); i++){
          String s = strVal.substring(i,i+1);
          int num = Integer.parseInt(s);
          if(num == 0){
              //“零”作特殊处理
              if(i != strVal.length()) //转换后数末位不能为零
                  rst += "零";
          }else{
              //If IntKey = 1 And i = 2 Then
                  //“壹拾”作特殊处理
                  //“壹拾”合理
              //Else
                  rst += NUM.substring(num,num+1);
              //End If
              //追加单位
              if(i != strVal.length()-1 )//个位不加单位
                rst += UNIT.substring(i+4-strVal.length(),i+4-strVal.length()+1);
          }
      }
      return rst;
  }
  private static String dropZero(String strVal){
      //去除连继的“零”
      String strRst;
      String strBefore; //前一位置字符
      String strNow;    //现在位置字符

      strBefore = strVal.substring(0,1);
      strRst = strBefore;

      for(int i= 1; i<strVal.length(); i++) {
          strNow = strVal.substring(i, i+1);
          if(strNow.equals("零") && strBefore.equals("零"))
              ;//同时为零
          else
              strRst += strNow;
          strBefore = strNow;
      }

      //末位去零
      if(strRst.substring(strRst.length()-1, strRst.length()).equals("零"))
        strRst = strRst.substring(0,strRst.length()-1);
      return strRst;
  }

  public static void main(String[] args) {
    System.out.println(RMB.toBigAmt(10052345.00D));
    System.out.println(RMB.toBigAmt(0.00D));
    System.out.println(RMB.toBigAmt(0.60D));
    System.out.println(RMB.toBigAmt(00.60D));
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值