关于数字转化为大写的工具类

最近在做一个报表,用到了数字转化为中文大写,自己实在写不出来,就参考了一下网上,以下是别人的工具类:
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();
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值