欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java将金额转成大写 博客分类: Java 编程 大小写转换Java金额人民币转大写 

程序员文章站 2024-03-13 13:15:09
...
         private static final Map<Long, Character> nums = new HashMap<Long, Character>();

	public static final int MAX_LENGTH = 20;

	private static final String OVER_FLOW = "OVERFLOW";

	static {
		nums.put(0l, '零');
		nums.put(1l, '壹');
		nums.put(2l, '贰');
		nums.put(3l, '叁');
		nums.put(4l, '肆');
		nums.put(5l, '伍');
		nums.put(6l, '陆');
		nums.put(7l, '柒');
		nums.put(8l, '捌');
		nums.put(9l, '玖');
		nums.put(10l, '拾');
		nums.put(100l, '佰');
		nums.put(1000l, '仟');
		nums.put(10000l, '万');
		nums.put(100000000l, '亿');
		nums.put(1000000000000l, '兆');
		nums.put(10000000000000000l, '京');
	}

	/**
	 * 转换为中文大写数字,万亿级转换,最多可到<br/>
	 * 九千九百九十九京九千九百九十九兆九千九百九十九亿<br/>
	 * 九千九百九十九万九千九百九十九元九角九分。<br/>
	 * 必须是非科学计数法的数字。
	 * 
	 * @param money
	 * @return
	 */
	public static String getChineseStyleMoney(double money) {
		return getChineseStyleMoney(String.valueOf(money));
	}

	/**
	 * 转换为中文大写数字,万亿级转换,最多可到<br/>
	 * 九千九百九十九京九千九百九十九兆九千九百九十九亿<br/>
	 * 九千九百九十九万九千九百九十九元九角九分。<br/>
	 * 必须是非科学计数法的数字。
	 * 
	 * @param money
	 * @return 中文大写数字表示的金额,如果超过额定大小,将返回<code>OVER_FLOW</code>
	 */
	public static String getChineseStyleMoney(String money) {
		int index = money.indexOf(".");
		String strNum = index > 0 ? money.substring(0, index) : money;
		if (strNum.length() > MAX_LENGTH) {
			return OVER_FLOW;
		}
		StringBuffer sb = new StringBuffer(getInteger(strNum));
		if (sb.length() > 0) {
			sb.append("圆");
		}
		if (index > 0) {
			String pointNum = money.substring(index);
			char c = pointNum.charAt(1);
			if (c - 48 != 0) {
				sb.append(nums.get(c - 48l)).append("角");
			}
			if (pointNum.length() >= 3) {
				c = pointNum.charAt(2);
				if (c - 48 != 0) {
					sb.append(nums.get(c - 48l)).append("分");
				}
			}
		} else {
			if (sb.length() == 0) {
				sb.append(nums.get(0l));
			} else {
				sb.append("整");
			}
		}

		return sb.toString();
	}

	/**
	 * 转换整数。
	 * 
	 * @return
	 */
	private static String getInteger(String strNum) {
		int size = strNum.length() % 4 == 0 ? strNum.length() / 4 : strNum
				.length() / 4 + 1;
		String[] parts = new String[size == 0 ? 1 : size];
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < size; i++) {
			int endIndex = strNum.length() - (size - i) * 4 + 4;
			int startIndex = endIndex - 4 > 0 ? endIndex - 4 : 0;
			parts[i] = strNum.substring(startIndex, endIndex);
			int part = Integer.parseInt(parts[i]);
			// @@ 如果sb长度为零表示前面还没有数字,这时如果part是零,就略过。
			if (sb.length() == 0 && part == 0) {
				continue;
			}
			// @@ 如果这部分的位数≤3,并且总位数大于0,表示前面还有数字,那么
			// @@ 在这部分数字前面要加“零”,如10900,被分成两部分,“1”和“0900”,
			// @@ 转换后分别是“壹万”和“玖佰”,那么应该要在这两部分之间加上一个“零”
			if (part > 0 && part <= 999 && sb.length() > 0
					&& sb.toString().endsWith(nums.get(0l).toString()) == false) {
				sb.append(nums.get(0l));
			}
			sb.append(getChineseStyleInteger(part));
			int powArg = (size - i) * 2 + 2;
			if (part != 0) {
				if (powArg >= 5 && powArg <= 7) {
					sb.append(nums.get(Double.valueOf(Math.pow(10, 4))
							.longValue()));
				} else if (powArg >= 8 && powArg <= 9) {
					sb.append(nums.get(Double.valueOf(Math.pow(10, 8))
							.longValue()));
				} else if (powArg >= 10 && powArg <= 11) {
					sb.append(nums.get(Double.valueOf(Math.pow(10, 12))
							.longValue()));
				} else if (powArg >= 12 && powArg <= 13) {
					sb.append(nums.get(Double.valueOf(Math.pow(10, 16))
							.longValue()));
				}
			}
			// @@ 这部分的数字以‘0’结尾,在转换后要加一个“零”。
			if (parts[i].endsWith("0") && i != size - 1
					&& sb.toString().endsWith(nums.get(0l).toString()) == false) {
				sb.append(nums.get(0l));
			}
		}
		return sb.toString();
	}

	/**
	 * 转换小数部分。
	 * 
	 * @param sub
	 * @return
	 */
	private static String getFloat(String sub) {
		StringBuffer sb = new StringBuffer();
		sb.append(nums.get(0l)).append("点");
		for (int i = 1; i < sub.length(); i++) {
			char c = sub.charAt(i);
			sb.append(nums.get(c - 48l));
		}
		return sb.toString();
	}