关于数字转化为大写的工具类
最近在做一个报表,用到了数字转化为中文大写,自己实在写不出来,就参考了一下网上,以下是别人的工具类:
package com.weqia.common.util;
/**
* @author hy
* 将阿拉伯数字转换为大写
*/
public class CapitalUtil {
/**
* 阿拉伯数字对应的汉字大写字符集合.
*/
private static char[] N = new char[] { '零', '壹', '贰', '叁', '肆', '伍', '陆',
'柒', '捌', '玖' };
/**
* 基本单位字符集合.
*/
private static char[] U = new char[] { '拾', '佰', '仟' };
/**
* 特殊单位字符集合.
*/
private static char[] X = new char[] { '万', '亿', '兆' };
/**
*
* @param d
* @return
*/
public static String toCapital(double d) {
if (d <= 0)
return "";
if (d > Long.MAX_VALUE)
throw new IllegalArgumentException("参数超出长整数的最大支持范围!");
String str = rawProcess(d);
StringBuffer result = postProcess(d, str);
fractionProcess(d, result);
return result.toString();
}
/**
* 小数部分处理.
*
* @param d
* @param result
*/
private static void fractionProcess(double d, StringBuffer result) {
if (d % 1 > 0) {// 处理小数部分, 仅支持两位小数
int fraction = ((int) (d * 100)) % 100;
if (fraction / 10 != 0) {
result.append(N[fraction / 10] + "角");
}
if (fraction % 10 != 0) {
result.append(N[fraction % 10] + "分");
}
} else {// 如果沒有小数, 尾部为'整'
result.append("整");
}
}
/**
* 后处理过程, 处理为惯用法.
*
* @param d
* @param str
* @return
*/
private static StringBuffer postProcess(double d, String str) {
StringBuffer result = new StringBuffer();
char[] chars = str.toCharArray();
for (int i = 0; i < chars.length; i++) {
char c = chars[i];
if (c == N[0]) {// 处理为惯用用法
if (i < chars.length - 1) {
int ignoreType = 0;
for (int j = 0; j < U.length; j++) {// 处理诸如'零仟', '零佰',
// '零拾'等情况
if (chars[i + 1] == U[j]) {
ignoreType = -1;
break;
}
}
for (int j = 0; j < X.length; j++) {// 处理诸如'零亿','零万'等情况
if (chars[i + 1] == X[j]) {
ignoreType = 1;
break;
}
}
final int length = result.length();
switch (ignoreType) {
case -1:
// 保证不输出相邻重复的'零', 跳过'零'后的单位符号
i++;
if (length > 0 && result.charAt(length - 1) != N[0])
result.append(N[0]);
break;
case 1:
// 如果单位'万','亿','兆'前面出现'零',则删除'零'
i++;
if (length > 0 && result.charAt(length - 1) == N[0])
result.deleteCharAt(length - 1);
char v = result.charAt(result.length() - 1);
boolean append = true;
for (int j = 0; j < X.length; j++) {// 处理诸如'亿万'的情况
if (v == X[j]) {
append = false;
break;
}
}
if (append)
result.append(chars[i]);
break;
}
}
} else {
result.append(c);
}
}
// 处理最后一个字符是'零'的情况
int len = result.length();
if (len > 0 && result.charAt(len - 1) == N[0]) {
result.deleteCharAt(len - 1);
}
result.append('圆');
return result;
}
/**
*
* @param d
* @return
*/
private static String rawProcess(double d) {
StringBuffer buf = new StringBuffer();
long n = (long) d;
int bit = 0;
int x = 0;
while (n > 0) {
int m = (int) (n % 10);// 最低位数字
buf.append(N[m]);
n = n / 10;
if (n > 0) {
int index = bit % 4;
if (index == 3)
buf.append(X[x++]);
else
buf.append(U[index]);
}
bit++;
}
return buf.reverse().toString();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理