1package com.test; 2 3import java.math.BigDecimal; 4 5/** 6 * 7 * 8 * 数字转换为汉语中人民币的大写<br> 9 * 10 */ 11public class NumberToCN { 12 /** 13 * 汉语中数字大写 14 */ 15 private static final String[] CN_UPPER_NUMBER = { "零", "壹", "贰", "叁", "肆", 16 "伍", "陆", "柒", "捌", "玖" }; 17 /** 18 * 汉语中货币单位大写,这样的设计类似于占位符 19 */ 20 private static final String[] CN_UPPER_MONETRAY_UNIT = { "分", "角", "元", 21 "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "兆", "拾", 22 "佰", "仟" }; 23 /** 24 * 特殊字符:整 25 */ 26 private static final String CN_FULL = "整"; 27 /** 28 * 特殊字符:负 29 */ 30 private static final String CN_NEGATIVE = "负"; 31 /** 32 * 金额的精度,默认值为2 33 */ 34 private static final int MONEY_PRECISION = 2; 35 /** 36 * 特殊字符:零元整 37 */ 38 private static final String CN_ZEOR_FULL = "零元" + CN_FULL; 39 40 /** 41 * 把输入的金额转换为汉语中人民币的大写 42 * 43 * @param numberOfMoney 44 * 输入的金额 45 * @return 对应的汉语大写 46 */ 47 public static String number2CNMontrayUnit(BigDecimal numberOfMoney) { 48 StringBuffer sb = new StringBuffer(); 49 // -1, 0, or 1 as the value of this BigDecimal is negative, zero, or 50 // positive. 51 int signum = numberOfMoney.signum(); 52 // 零元整的情况 53 if (signum == 0) { 54 return CN_ZEOR_FULL; 55 } 56 // 这里会进行金额的四舍五入 57 long number = numberOfMoney.movePointRight(MONEY_PRECISION) 58 .setScale(0, 4).abs().longValue(); 59 // 得到小数点后两位值 60 long scale = number % 100; 61 int numUnit = 0; 62 int numIndex = 0; 63 boolean getZero = false; 64 // 判断最后两位数,一共有四中情况:00 = 0, 01 = 1, 10, 11 65 if (!(scale > 0)) { 66 numIndex = 2; 67 number = number / 100; 68 getZero = true; 69 } 70 if ((scale > 0) && (!(scale % 10 > 0))) { 71 numIndex = 1; 72 number = number / 10; 73 getZero = true; 74 } 75 int zeroSize = 0; 76 while (true) { 77 if (number <= 0) { 78 break; 79 } 80 // 每次获取到最后一个数 81 numUnit = (int) (number % 10); 82 if (numUnit > 0) { 83 if ((numIndex == 9) && (zeroSize >= 3)) { 84 sb.insert(0, CN_UPPER_MONETRAY_UNIT[6]); 85 } 86 if ((numIndex == 13) && (zeroSize >= 3)) { 87 sb.insert(0, CN_UPPER_MONETRAY_UNIT[10]); 88 } 89 sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]); 90 sb.insert(0, CN_UPPER_NUMBER[numUnit]); 91 getZero = false; 92 zeroSize = 0; 93 } else { 94 ++zeroSize; 95 if (!(getZero)) { 96 sb.insert(0, CN_UPPER_NUMBER[numUnit]); 97 } 98 if (numIndex == 2) { 99 if (number > 0) { 100 sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]); 101 } 102 } else if (((numIndex - 2) % 4 == 0) && (number % 1000 > 0)) { 103 sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]); 104 } 105 getZero = true; 106 } 107 // 让number每次都去掉最后一个数 108 number = number / 10; 109 ++numIndex; 110 } 111 // 如果signum == -1,则说明输入的数字为负数,就在最前面追加特殊字符:负 112 if (signum == -1) { 113 sb.insert(0, CN_NEGATIVE); 114 } 115 // 输入的数字小数点后两位为"00"的情况,则要在最后追加特殊字符:整 116 if (!(scale > 0)) { 117 sb.append(CN_FULL); 118 } 119 return sb.toString(); 120 } 121 122 public static void main(String[] args) { 123 double money = 3000.66; 124 BigDecimal numberOfMoney = new BigDecimal(money); 125 String s = NumberToCN.number2CNMontrayUnit(numberOfMoney); 126 System.out.println("你输入的金额为:【" + money + "】 #--# [" + s.toString() 127 + "]"); 128 } 129}
Java货币金额转换为大写形式
Wesley13
2021-10-11
1131 0 0
点赞
收藏
评论区
加载中...