小写金额转化成大写金额java代码

本文介绍了一个Java程序,该程序能够将数字形式的人民币金额转换成汉字形式的大写金额,适用于财务系统中显示或打印凭证的需求。
</pre><pre name="code" class="java"><pre name="code" class="java">
import java.text.DecimalFormat;

public class ChangeRMB {

    private static final String[] NUMBERS = { "零", "壹", "贰", "叁", "肆", "伍", "陆","柒", "捌", "玖" };
    
    private static final String[] IUNIT = { "圆", "拾", "佰", "仟", "万", "拾", "佰","仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟" };
    
    private static final String[] DUNIT = { "角", "分", "厘" };

    
    public static String doChangeRMB(String str) {
      str=formatDouble(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)+getChineseSuffix(decimals);
    }
    
    /**
     * 如果没有小数加后缀”整“
     * @param suffix
     * @return
     */
    private static String getChineseSuffix(int[] suffix){
        String ret = "";
        boolean flag = true;
        for (int i = 0; i < suffix.length; i++) {
            if(suffix[i]!=0){
                flag = false;
            }
        }
        if(flag){
            ret = "整";
        }
        return ret;
    }
    
    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();
    }

    
    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;
      }
    }

    private static String formatDouble(String val) {
        if(val==null){
            return "0";
        }
        
        DecimalFormat df = new DecimalFormat();  
        df.setMaximumFractionDigits(2); 
        String result = df.format(Double.valueOf(val)).replaceAll(",", "");  
        return result;
    }

    public static void main(String[] args) {
      double number = 1590219.15;
      System.out.println(number + " " + ChangeRMB.doChangeRMB(1590219.15+""));
      
    }

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陶喜儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值