美元的阿拉伯数字变换为英文大写的格式

美元的阿拉伯数字转换为英文大写的格式

美元的阿拉伯数字转换为英文大写的格式,参考了网上的代码,然后重构整理了一下。

 

package com.proviaa.ipds.test;

import com.proviaa.ipds.util.CommonUtils;

/**
 * 把表示美元的阿拉伯数字转换为英文大写的格式。
 * 
 * @author Ken
 * 
 */
public class DollarsNumberFormat {
	private static final String[] MAJORS = { " ", " Thousand ", " Million ",
			" Billion ", " Trillion ", " Quadrillion ", " Quintillion " };

	private static final String[] TENS = { " ", " Ten ", " Twenty ", " Thirty ",
			" Forty ", " Fifty ", " Sixty ", " Seventy ", " Eighty ",
			" Ninety " };

	private static final String[] NUMBERS = { " ", " One ", " Two ", " Three ",
			" Four ", " Five ", " Six ", " Seven ", " Eight ", " Nine ",
			" Ten ", " Eleven ", " Twelve ", " Thirteen ", " Fourteen ",
			" Fifteen ", " Sixteen ", " Seventeen ", " Eighteen ", " Nineteen " };

	/**
	 * 把阿拉伯数字转换为英文大写格式。<br>
	 * 例如:123.01:One Hundred Twenty Three Dollars And One Cent
	 * 
	 * @param value
	 * @return
	 */
	public String format(double value) {
		double number = CommonUtils.round(value, 2);// 小数点保留两位
		String result = getDollarPart(number) + getCentPart(number);
		return result.replace("  ", " ").toUpperCase();// 去掉多余的空格,并转为大写
	}

	// 获取整数部分的转换
	private String getDollarPart(double value) {
		int number = (int) value;
		String dollars = formatDigit(number);
		if (dollars.trim().equals(""))
			return "No Dollars";
		else if (dollars.trim().equals("One"))
			return "One Dollar";
		else
			return dollars + " Dollars";

	}

	// 获取小数部分的转换
	private String getCentPart(double number) {
		int cents = (int) (Math.round(number * 100) - ((int) number) * 100);
		String centsPart = formatDigit(cents);

		if (centsPart.trim().equals(""))
			return " And No Cents";
		else if (centsPart.trim().equals("One"))
			return " And One Cent";
		else
			return " And " + centsPart + " Cents";
	}

	private String formatDigit(int value) {
		int number = value;
		String prefix = ""; // 正负号前缀。

		if (number < 0) {
			number = -number;
			prefix = "Negative ";
		}

		String result = "";
		int index = 0;
		do {
			int n = number % 1000;
			if (n != 0) {
				result = formatLessThanOneThousand(n) + MAJORS[index] + result;
			}
			index++;
			number /= 1000;
		} while (number > 0);

		return (prefix + result).trim();
	}

	private String formatLessThanOneThousand(int value) {
		int number = value;
		String result = "";
		if (number % 100 < 20) {// 前两位数的值在20以内。
			result = NUMBERS[number % 100];
			number /= 100;
		} else {// 前两位数的值在20以外。
			result = NUMBERS[number % 10];// 个位
			number /= 10;

			result = TENS[number % 10] + result;// 十位&个位
			number /= 10;
		}
		if (number == 0)
			return result;
		else
			return NUMBERS[number] + " Hundred " + result; // 百位&十位&个位。
	}

	public static void main(String[] args) {
		DollarsNumberFormat f = new DollarsNumberFormat();
		System.out.println("123456789 = " + f.format(123456789));
		System.out.println("123.01 = " + f.format(123.01));
		System.out.println("0.01 = " + f.format(0.01));
		System.out.println("0.0 = " + f.format(0.0));
		System.out.println("-123.71 = " + f.format(-123.71));

	}
}

 

测试结果:

 

123456789 = ONE HUNDRED TWENTY THREE MILLION FOUR HUNDRED FIFTY SIX THOUSAND SEVEN HUNDRED EIGHTY NINE DOLLARS AND NO CENTS
123.01 = ONE HUNDRED TWENTY THREE DOLLARS AND ONE CENT
0.01 = NO DOLLARS AND ONE CENT
0.0 = NO DOLLARS AND NO CENTS
-123.71 = NEGATIVE ONE HUNDRED TWENTY THREE DOLLARS AND NEGATIVE SEVENTY ONE CENTS