package com.ruoyi.web.controller.tool;
|
|
public class NumberToChineseUtils {
|
|
// 中文数字字符
|
private static final char[] CHINESE_NUMBERS = {'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'};
|
// 单位字符
|
private static final String[] UNITS = {"", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿"};
|
|
/**
|
* 数字转大写中文
|
*
|
* @param num 需要转换的数字
|
* @return 转换后的大写中文字符串
|
*/
|
public static String numberToChinese(long num) {
|
if (num == 0) {
|
return "零";
|
}
|
|
StringBuilder result = new StringBuilder();
|
String numStr = String.valueOf(num);
|
int unitIndex = 0; // 单位索引
|
boolean zeroFlag = false; // 标记上一个字符是否为0
|
|
for (int i = numStr.length() - 1; i >= 0; i--) {
|
int digit = numStr.charAt(i) - '0';
|
String part = toChinesePart(digit, unitIndex, zeroFlag);
|
result.insert(0, part);
|
|
// 更新上一个字符是否为零的标记
|
zeroFlag = digit == 0;
|
|
// 更新单位索引
|
if (unitIndex == 4 || unitIndex == 8) {
|
unitIndex = 1; // 万和亿后单位重置
|
} else {
|
unitIndex++;
|
}
|
}
|
|
// 去除结果字符串末尾的'零'
|
while (result.length() > 1 && result.charAt(result.length() - 1) == '零') {
|
result.deleteCharAt(result.length() - 1);
|
}
|
|
return result.toString();
|
}
|
|
/**
|
* 转换数字部分并添加单位
|
*
|
* @param digit 当前数字
|
* @param unitIndex 单位索引
|
* @param zeroFlag 上一个字符是否为零
|
* @return 转换后的字符串
|
*/
|
private static String toChinesePart(int digit, int unitIndex, boolean zeroFlag) {
|
if (digit == 0) {
|
return zeroFlag ? "" : "零";
|
}
|
|
String part = CHINESE_NUMBERS[digit] + UNITS[unitIndex];
|
|
// 连续两个'零'只保留一个
|
if (part.equals("零零") || part.equals("零拾")) {
|
return "零";
|
}
|
|
// 去除'零拾'、'零佰'、'零仟'
|
if (part.startsWith("零")) {
|
part = part.substring(1);
|
}
|
|
return part;
|
}
|
|
/**
|
* 数字转大写中文(支持小数)
|
*
|
* @param number 需要转换的数字
|
* @return 转换后的大写中文字符串
|
*/
|
public static String numberToChinese(double number) {
|
if (number == 0) {
|
return "零";
|
}
|
|
StringBuilder result = new StringBuilder();
|
String numStr = String.format("%.2f", number); // 保留两位小数
|
String[] parts = numStr.split("\\.");
|
|
// 整数部分
|
if (!parts[0].equals("0")) {
|
result.append(numberToChinese(Long.parseLong(parts[0])));
|
}
|
|
// 小数部分
|
if (parts.length > 1) {
|
String decimalPart = parts[1];
|
if (!decimalPart.equals("00")) {
|
result.append("元");
|
if (decimalPart.charAt(0) != '0') {
|
result.append(CHINESE_NUMBERS[decimalPart.charAt(0) - '0']).append("角");
|
}
|
if (decimalPart.charAt(1) != '0') {
|
result.append(CHINESE_NUMBERS[decimalPart.charAt(1) - '0']).append("分");
|
}
|
} else {
|
result.append("元整");
|
}
|
} else {
|
result.append("元整");
|
}
|
|
return result.toString();
|
}
|
|
public static void main(String[] args) {
|
System.out.println(numberToChinese(123456)); // 输出: 壹拾贰万叁仟肆佰伍拾陆元整
|
System.out.println(numberToChinese(10010)); // 输出: 壹万零壹拾元整
|
System.out.println(numberToChinese(100000001)); // 输出: 壹亿零壹元整
|
System.out.println(numberToChinese(68435)); // 输出: 陆万捌仟肆佰叁拾伍元整
|
System.out.println(numberToChinese(24000)); // 输出: 捌仟伍佰肆拾叁元整
|
System.out.println(numberToChinese(123.45)); // 输出: 壹佰贰拾叁元肆角伍分
|
System.out.println(numberToChinese(0.67)); // 输出: 零元陆角柒分
|
System.out.println(numberToChinese(100.00)); // 输出: 壹佰元整
|
}
|
}
|