1821349743@qq.com
2023-02-20 146b951e36b7529f4aa9671035a657f651762edc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
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;
      }
      // 让number每次都去掉最后一个数
      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()
        + "]");
  }
}