• java实现人民币大写转换


    简介

    将阿拉伯数字转换成中文大写,如将123.45转换成壹佰贰拾叁元肆角伍分

    代码实现

    import java.util.regex.Pattern;
    
    public class CurrencyUtil {
    
      private CurrencyUtil() {
      }
    
      //无效字符
      private static final Pattern INVALID_CHARACTER = Pattern.compile("[^,.\d]");
      //有效数字格式
      private static final Pattern VALID_DIGIT = Pattern
          .compile("^((\d{1,3}(,\d{3})*(.((\d{3},)*\d{1,3}))?)|(\d+(.\d+)?))$");
      //最大值999亿多
      private static final double MAXIMUM_NUMBER = 99999999999.99;
      //货币符号
      private static final String CN_ZERO = "零";
      private static final String CN_ONE = "壹";
      private static final String CN_TWO = "贰";
      private static final String CN_THREE = "叁";
      private static final String CN_FOUR = "肆";
      private static final String CN_FIVE = "伍";
      private static final String CN_SIX = "陆";
      private static final String CN_SEVEN = "柒";
      private static final String CN_EIGHT = "捌";
      private static final String CN_NINE = "玖";
      private static final String CN_TEN = "拾";
      private static final String CN_HUNDRED = "佰";
      private static final String CN_THOUSAND = "仟";
      private static final String CN_TEN_THOUSAND = "万";
      private static final String CN_HUNDRED_MILLION = "亿";
      private static final String CN_DOLLAR = "元";
      private static final String CN_TEN_CENT = "角";
      private static final String CN_CENT = "分";
      private static final String CN_INTEGER = "整";
      //整数 0-9
      private static final String[] DIGITS = {
          CN_ZERO, CN_ONE, CN_TWO, CN_THREE, CN_FOUR, CN_FIVE, CN_SIX, CN_SEVEN, CN_EIGHT, CN_NINE};
      //基数 百 千
      private static final String[] RADICES = {"", CN_TEN, CN_HUNDRED, CN_THOUSAND};
      //大基数 万 亿
      private static final String[] BIGRADICES = {"", CN_TEN_THOUSAND, CN_HUNDRED_MILLION};
      //小数 角 分
      private static final String[] DECIMALS = {CN_TEN_CENT, CN_CENT};
    
      private static String convertCurrency(String currencyDigits) {
        if (currencyDigits == null || currencyDigits.length() == 0) {
          System.out.println("不能为空");
          return "";
        }
        //字符串中不能包含除了逗号点号和数字的其他字符
        if (INVALID_CHARACTER.matcher(currencyDigits).matches()) {
          System.out.println("包含无效字符");
          return "";
        }
        if (!VALID_DIGIT.matcher(currencyDigits).matches()) {
          System.out.println("数字格式错误");
          return "";
        }
        //移除所有的逗号
        currencyDigits = currencyDigits.replaceAll(",", "");
        //移除所有的前导零
        currencyDigits = currencyDigits.replaceAll("^0+", "");
        // Assert the number is not greater than the maximum number.
        if (Double.parseDouble(currencyDigits) > MAXIMUM_NUMBER) {
          return "";
        }
        //根据点号分割成两部分整数和小数
        String[] parts = currencyDigits.split("\.");
        //整数
        String integral;
        //小数
        String decimal;
        if (parts.length > 1) {
          integral = parts[0];
          decimal = parts[1];
          //小数最多保留2位
          if (decimal.length() >= 2) {
            decimal = decimal.substring(0, 2);
          } else {
            decimal = decimal.substring(0, 1);
          }
        } else {
          integral = parts[0];
          decimal = "";
        }
        StringBuilder outputCharacters = new StringBuilder();
        //处理整数
        if (Integer.parseInt(integral) > 0) {
          int zeroCount = 0;
          for (int i = 0; i < integral.length(); i++) {
            int p = integral.length() - i - 1;
            int d = integral.charAt(i) - '0';
            int quotient = p / 4;
            int modulus = p % 4;
            if (d == 0) {
              zeroCount++;
            } else {
              if (zeroCount > 0) {
                outputCharacters.append(DIGITS[0]);
              }
              zeroCount = 0;
              outputCharacters.append(DIGITS[d]).append(RADICES[modulus]);
            }
            if (modulus == 0 && zeroCount < 4) {
              outputCharacters.append(BIGRADICES[quotient]);
            }
          }
          outputCharacters.append(CN_DOLLAR);
        }
        //处理小数
        if (!decimal.isEmpty()) {
          for (int i = 0; i < decimal.length(); i++) {
            int d = decimal.charAt(i) - '0';
            int ds = decimal.charAt(decimal.length() - 1) - '0';
            if (d == 0) {
              if (ds != 0) {
                outputCharacters.append(DIGITS[d]);
              }
            } else {
              outputCharacters.append(DIGITS[d]).append(DECIMALS[i]);
            }
          }
        }
        if (outputCharacters.length() == 0) {
          outputCharacters.append(CN_ZERO).append(CN_DOLLAR);
        }
        if (decimal.isEmpty()) {
          outputCharacters.append(CN_INTEGER);
        }
        return outputCharacters.toString();
      }
    
      public static void main(String[] args) {
        System.out.println(convertCurrency("12.045"));
      }
    }
    

    最大支持999亿,支持小数。

    参考

    人民币大写在线转换工具 - 917118

  • 相关阅读:
    C#/Net代码精简优化技巧(二)【转】
    IsSpecialName特性及其他问题【转】
    &、|与&&、||的比较
    序列化后存储Cookie
    序列化反序列化操作
    C#/Net代码精简优化技巧(一)【转】
    .Net 中的序列化与反序列化【转】
    c#对象序列化(二进制序列化)BinaryFormatter【转】
    POJ 2828 Buy Tickets(单点更新) 详细题解和思路
    Color the ball HDU 1556 (非线段树做法)
  • 原文地址:https://www.cnblogs.com/strongmore/p/14540099.html
Copyright © 2020-2023  润新知