|
|
@@ -8,54 +8,110 @@ import java.math.BigDecimal;
|
|
|
*/
|
|
|
public class BigDecimalUtils {
|
|
|
|
|
|
+ private static final String[] units = {
|
|
|
+ "", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten",
|
|
|
+ "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen",
|
|
|
+ "Eighteen", "Nineteen"
|
|
|
+ };
|
|
|
+
|
|
|
+ private static final String[] tens = {
|
|
|
+ "", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"
|
|
|
+ };
|
|
|
+
|
|
|
/**
|
|
|
* 数字转英文大写
|
|
|
*
|
|
|
* @param number 数字
|
|
|
* @return 结果
|
|
|
*/
|
|
|
- public static String convertToEnglish(BigDecimal number) {
|
|
|
+ public static String convertToEnglish(BigDecimal number, Boolean toUpper) {
|
|
|
BigDecimal integerPart = number.setScale(0, BigDecimal.ROUND_DOWN);
|
|
|
String decimal = number.toString();
|
|
|
+ String res = "";
|
|
|
if (decimal.indexOf(".") > 0) {
|
|
|
BigDecimal decimalAmount = new BigDecimal(decimal.substring(decimal.indexOf(".") + 1));
|
|
|
- long integralPart = integerPart.longValue();
|
|
|
+ int integralPart = integerPart.intValue();
|
|
|
String uppercaseInteger = convert(integralPart).trim();
|
|
|
if (new BigDecimal("0.00").compareTo(decimalAmount) != 0) {
|
|
|
- uppercaseInteger = uppercaseInteger + " POINT " + convert(decimalAmount.longValue()).trim();
|
|
|
+ uppercaseInteger = uppercaseInteger + " POINT " + convert(decimalAmount.intValue()).trim();
|
|
|
}
|
|
|
- return uppercaseInteger;
|
|
|
+ res = uppercaseInteger;
|
|
|
} else {
|
|
|
- long integralPart = integerPart.longValue();
|
|
|
- return convert(integralPart).trim();
|
|
|
+ int integralPart = integerPart.intValue();
|
|
|
+ res = convert(integralPart).trim();
|
|
|
}
|
|
|
+
|
|
|
+ return toUpper==true ? res.toUpperCase() : res;
|
|
|
}
|
|
|
|
|
|
- private static String convert(long number) {
|
|
|
- if (number == 0) return "ZERO";
|
|
|
+ public static String convertToEnglish(BigDecimal number) {
|
|
|
+ return convertToEnglish(number, true);
|
|
|
+ }
|
|
|
|
|
|
- StringBuilder result = new StringBuilder();
|
|
|
+ // private static String convert(long number) {
|
|
|
+ // if (number == 0) return "ZERO";
|
|
|
+ //
|
|
|
+ // StringBuilder result = new StringBuilder();
|
|
|
+ //
|
|
|
+ // if ((number / 1000) > 0) {
|
|
|
+ // result.append(convert(number / 1000)).append(" THOUSAND ");
|
|
|
+ // number %= 1000;
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // if ((number / 100) > 0) {
|
|
|
+ // result.append(convert(number / 100)).append(" HUNDRED ");
|
|
|
+ // number %= 100;
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // if (number > 0) {
|
|
|
+ // if (number < 20) {
|
|
|
+ // result.append(MagicValues.units[(int) number]).append(" ");
|
|
|
+ // } else {
|
|
|
+ // result.append(MagicValues.tens[(int) number / 10]).append(" ");
|
|
|
+ // if (number % 10 > 0) {
|
|
|
+ // result.append(MagicValues.units[(int) number % 10]).append(" ");
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // return result.toString();
|
|
|
+ // }
|
|
|
|
|
|
- if ((number / 1000) > 0) {
|
|
|
- result.append(convert(number / 1000)).append(" THOUSAND ");
|
|
|
- number %= 1000;
|
|
|
+ private static String convert(int number) {
|
|
|
+ if (number == 0) {
|
|
|
+ return "Zero";
|
|
|
}
|
|
|
|
|
|
- if ((number / 100) > 0) {
|
|
|
- result.append(convert(number / 100)).append(" HUNDRED ");
|
|
|
- number %= 100;
|
|
|
+ return convertToWords(number, false).trim();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 注意:此实现最多支持到十亿(Integer的最大值约为20亿,所以足够处理int范围的正数)。
|
|
|
+ // 如果需要处理更大的数字(如Long类型),可以扩展代码添加更大的单位(Trillion等)
|
|
|
+ private static String convertToWords(int number, Boolean pre) {
|
|
|
+ if (number < 0) {
|
|
|
+ return "Minus " + convertToWords(-number, pre);
|
|
|
}
|
|
|
|
|
|
- if (number > 0) {
|
|
|
- if (number < 20) {
|
|
|
- result.append(MagicValues.units[(int) number]).append(" ");
|
|
|
- } else {
|
|
|
- result.append(MagicValues.tens[(int) number / 10]).append(" ");
|
|
|
- if (number % 10 > 0) {
|
|
|
- result.append(MagicValues.units[(int) number % 10]).append(" ");
|
|
|
- }
|
|
|
- }
|
|
|
+ if (number < 20) {
|
|
|
+ return units[number];
|
|
|
}
|
|
|
- return result.toString();
|
|
|
+
|
|
|
+ if (number < 100) {
|
|
|
+ String S = tens[number / 10] + ((number % 10 != 0) ? " " + units[number % 10] : "");
|
|
|
+ return pre == true && !S.isEmpty() ? "And " + S : S;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (number < 1000) {
|
|
|
+ return units[number / 100] + " Hundred" + ((number % 100 != 0) ? " " + convertToWords(number % 100, true) : "");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (number < 1000000) {
|
|
|
+ return convertToWords(number / 1000, false) + " Thousand" + ((number % 1000 != 0) ? " " + convertToWords(number % 1000, false) : "");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (number < 1000000000) {
|
|
|
+ return convertToWords(number / 1000000, false) + " Million" + ((number % 1000000 != 0) ? " " + convertToWords(number % 1000000, false) : "");
|
|
|
+ }
|
|
|
+
|
|
|
+ return convertToWords(number / 1000000000, false) + " Billion" + ((number % 1000000000 != 0) ? " " + convertToWords(number % 1000000000, false) : "");
|
|
|
}
|
|
|
}
|