package com.product.administration.util;

import java.math.BigDecimal;

/**
 * @program: lx-server
 * @Date: 2020/11/24 16:23
 * @Author: luoxin
 * @Description: 閲戦杞崲澶у啓
 */
public class MoneyUtil {
  /**
   * 姹夎涓暟瀛楀ぇ鍐�
   */
  private static final String[] CN_UPPER_NUMBER = { "闆�", "澹�", "璐�", "鍙�", "鑲�",
      "浼�", "闄�", "鏌�", "鎹�", "鐜�" };
  /**
   * 姹夎涓揣甯佸崟浣嶅ぇ鍐欙紝杩欐牱鐨勮璁$被浼间簬鍗犱綅绗�
   */
  private static final String[] CN_UPPER_MONETRAY_UNIT = { "鍒�", "瑙�", "鍏�",
      "鎷�", "浣�", "浠�", "涓�", "鎷�", "浣�", "浠�", "浜�", "鎷�", "浣�", "浠�", "鍏�", "鎷�",
      "浣�", "浠�" };
  /**
   * 鐗规畩瀛楃锛氭暣
   */
  private static final String CN_FULL = "鏁�";
  /**
   * 鐗规畩瀛楃锛氳礋
   */
  private static final String CN_NEGATIVE = "璐�";
  /**
   * 閲戦鐨勭簿搴︼紝榛樿鍊间负2
   */
  private static final int MONEY_PRECISION = 2;
  /**
   * 鐗规畩瀛楃锛氶浂鍏冩暣
   */
  private static final String CN_ZEOR_FULL = "闆跺厓" + CN_FULL;

  /**
   * 鎶婅緭鍏ョ殑閲戦杞崲涓烘眽璇腑浜烘皯甯佺殑澶у啓
   *
   * @param numberOfMoney
   *            杈撳叆鐨勯噾棰�
   * @return 瀵瑰簲鐨勬眽璇ぇ鍐�
   */
  public static String number2CNMontrayUnit(BigDecimal numberOfMoney) {
    StringBuilder sb = new StringBuilder();
    // -1, 0, or 1 as the value of this BigDecimal is negative, zero, or
    // positive.
    int signum = numberOfMoney.signum();
    // 闆跺厓鏁寸殑鎯呭喌
    if (signum == 0) {
      return CN_ZEOR_FULL;
    }
    // 杩欓噷浼氳繘琛岄噾棰濈殑鍥涜垗浜斿叆
    long number = numberOfMoney.movePointRight(MONEY_PRECISION)
        .setScale(0, 4).abs().longValue();
    // 寰楀埌灏忔暟鐐瑰悗涓や綅鍊�
    long scale = number % 100;
    int numUnit = 0;
    int numIndex = 0;
    boolean getZero = false;
    // 鍒ゆ柇鏈€鍚庝袱浣嶆暟锛屼竴鍏辨湁鍥涗腑鎯呭喌锛�00 = 0, 01 = 1, 10, 11
    if (!(scale > 0)) {
      numIndex = 2;
      number = number / 100;
      getZero = true;
    }
    if ((scale > 0) && (!(scale % 10 > 0))) {
      numIndex = 1;
      number = number / 10;
      getZero = true;
    }
    int zeroSize = 0;
    while (true) {
      if (number <= 0) {
        break;
      }
      // 姣忔鑾峰彇鍒版渶鍚庝竴涓暟
      numUnit = (int) (number % 10);
      if (numUnit > 0) {
        if ((numIndex == 9) && (zeroSize >= 3)) {
          sb.insert(0, CN_UPPER_MONETRAY_UNIT[6]);
        }
        if ((numIndex == 13) && (zeroSize >= 3)) {
          sb.insert(0, CN_UPPER_MONETRAY_UNIT[10]);
        }
        sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);
        sb.insert(0, CN_UPPER_NUMBER[numUnit]);
        getZero = false;
        zeroSize = 0;
      } else {
        ++zeroSize;
        if (!(getZero)) {
          sb.insert(0, CN_UPPER_NUMBER[numUnit]);
        }
        if (numIndex == 2) {
          if (number > 0) {
            sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);
          }
        } else if (((numIndex - 2) % 4 == 0) && (number % 1000 > 0)) {
          sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);
        }
        getZero = true;
      }
      // 璁﹏umber姣忔閮藉幓鎺夋渶鍚庝竴涓暟
      number = number / 10;
      ++numIndex;
    }
    // 濡傛灉signum == -1锛屽垯璇存槑杈撳叆鐨勬暟瀛椾负璐熸暟锛屽氨鍦ㄦ渶鍓嶉潰杩藉姞鐗规畩瀛楃锛氳礋
    if (signum == -1) {
      sb.insert(0, CN_NEGATIVE);
    }
    // 杈撳叆鐨勬暟瀛楀皬鏁扮偣鍚庝袱浣嶄负"00"鐨勬儏鍐碉紝鍒欒鍦ㄦ渶鍚庤拷鍔犵壒娈婂瓧绗︼細鏁�
    if (!(scale > 0)) {
      sb.append(CN_FULL);
    }
    return sb.toString();
  }

  public static void main(String[] args) {
    double money = 3000.66;
    //閿欒绀轰緥
    BigDecimal numberOfMoney = new BigDecimal(money);
    String s = MoneyUtil.number2CNMontrayUnit(numberOfMoney);
    System.out.println("浣犺緭鍏ョ殑閲戦涓猴細銆�" + money + "銆�   #--# [" + s.toString()
        + "]");
  }
}