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()
+ "]");
}
}