|
|
@@ -8,17 +8,10 @@ import java.math.BigDecimal;
|
|
|
*/
|
|
|
public class BigDecimalUtils {
|
|
|
|
|
|
- private static final String[] LESS_THAN_20 = {
|
|
|
- "", "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"
|
|
|
- };
|
|
|
- private static final String[] THOUSANDS = {
|
|
|
- "", "thousand", "million", "billion"
|
|
|
- };
|
|
|
+ private static final String[] LESS_THAN_20 = {"", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE", "TEN", "ELEVEN", "TWELVE", "THIRTEEN", "FOURTEEN", "FIFTEEN", "SIXTEEN", "SEVENTEEN", "EIGHTEEN", "NINETEEN"};
|
|
|
+ private static final String[] TENS = {"", "TEN", "TWENTY", "THIRTY", "FORTY", "FIFTY", "SIXTY", "SEVENTY", "EIGHTY", "NINETY"};
|
|
|
+ private static final String[] THOUSANDS = {"", "THOUSAND", "MILLION", "BILLION"};
|
|
|
+
|
|
|
|
|
|
/**
|
|
|
* 数字转英文大写
|
|
|
@@ -46,82 +39,72 @@ public class BigDecimalUtils {
|
|
|
}
|
|
|
return data;
|
|
|
}*/
|
|
|
- if (amount.compareTo(BigDecimal.ZERO) == 0) return "zero dollars";
|
|
|
-
|
|
|
- String[] parts = amount.toString().split("\\.");
|
|
|
+ if (amount.compareTo(BigDecimal.ZERO) == 0) return "ZERO";
|
|
|
+ String[] parts = amount.toPlainString().split("\\.");
|
|
|
String integerPart = parts[0];
|
|
|
- String fractionalPart = parts.length > 1 ? parts[1] : "00";
|
|
|
-
|
|
|
+ String decimalPart = parts.length > 1 ? parts[1] : "";
|
|
|
StringBuilder result = new StringBuilder();
|
|
|
- result.append(convertIntegerPart(integerPart)).append(" dollars");
|
|
|
- if (!fractionalPart.equals("00")) {
|
|
|
- result.append(" and ").append(convertFractionalPart(fractionalPart)).append(" cents");
|
|
|
- }
|
|
|
- return result.toString();
|
|
|
- }
|
|
|
-
|
|
|
- private static String convertIntegerPart(String number) {
|
|
|
- if (number.isEmpty()) return "";
|
|
|
-
|
|
|
- StringBuilder result = new StringBuilder();
|
|
|
- int length = number.length();
|
|
|
- for (int i = 0; i < length; i++) {
|
|
|
- if (length - i > 3) {
|
|
|
- result.append(convertThreeDigits(number.substring(i, i + 3))).append(" ");
|
|
|
- i += 2;
|
|
|
- } else {
|
|
|
- result.append(convertThreeDigits(number.substring(i)));
|
|
|
+ result.append(numberToWords(Integer.parseInt(integerPart)));
|
|
|
+ if (!decimalPart.isEmpty()) {
|
|
|
+ result.append(" POINT ");
|
|
|
+ for (char c : decimalPart.toCharArray()) {
|
|
|
+ result.append(LESS_THAN_20[Character.getNumericValue(c)]).append(" ");
|
|
|
}
|
|
|
}
|
|
|
- return result.toString().trim();
|
|
|
- }
|
|
|
-
|
|
|
- private static String convertThreeDigits(String number) {
|
|
|
- if (number.isEmpty()) return "";
|
|
|
-
|
|
|
- StringBuilder result = new StringBuilder();
|
|
|
- if (number.length() == 3) {
|
|
|
- int hundreds = Character.getNumericValue(number.charAt(0));
|
|
|
- if (hundreds > 0) {
|
|
|
- result.append(LESS_THAN_20[hundreds]).append(" hundred ");
|
|
|
+ String data = result.toString().trim().substring(result.toString().trim().lastIndexOf("AND"));
|
|
|
+ if ("AND".equals(data)) {
|
|
|
+ data = result.toString().trim().substring(0,result.toString().trim().lastIndexOf("AND"));
|
|
|
+ if (data.trim().lastIndexOf("AND") >= 0){
|
|
|
+ String data1 = data.trim().substring(data.trim().lastIndexOf("AND"));
|
|
|
+ if ("AND".equals(data1)){
|
|
|
+ data = data.trim().substring(0,data.trim().lastIndexOf("AND"));
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- if (number.length() >= 2) {
|
|
|
- int tens = Character.getNumericValue(number.charAt(number.length() - 2));
|
|
|
- if (tens > 1) {
|
|
|
- result.append(TENS[tens]).append(" ");
|
|
|
- } else if (tens == 1) {
|
|
|
- int teens = Character.getNumericValue(number.charAt(number.length() - 1));
|
|
|
- result.append(LESS_THAN_20[10 + teens]).append(" ");
|
|
|
+ data = data.trim();
|
|
|
+ if (data.lastIndexOf("-")>= 0){
|
|
|
+ String data2 = data.substring(data.lastIndexOf("-"));
|
|
|
+ if ("-".equals(data2)){
|
|
|
+ data = data.substring(0,data.lastIndexOf("-"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return data;
|
|
|
+ }else{
|
|
|
+ String data2 = result.toString().trim().substring(result.toString().trim().lastIndexOf("-"));
|
|
|
+ if ("-".equals(data2)){
|
|
|
+ data2 = result.toString().trim().substring(0,result.toString().trim().lastIndexOf("-"));
|
|
|
+ return data2;
|
|
|
+ }else{
|
|
|
return result.toString().trim();
|
|
|
}
|
|
|
}
|
|
|
- int ones = Character.getNumericValue(number.charAt(number.length() - 1));
|
|
|
- if (ones > 0) {
|
|
|
- result.append(LESS_THAN_20[ones]).append(" ");
|
|
|
- }
|
|
|
- return result.toString().trim();
|
|
|
}
|
|
|
|
|
|
- private static String convertFractionalPart(String number) {
|
|
|
- if (number.isEmpty()) return "";
|
|
|
-
|
|
|
+ private static String numberToWords(int num) {
|
|
|
+ if (num == 0) return " ";
|
|
|
StringBuilder result = new StringBuilder();
|
|
|
- if (number.length() == 1) {
|
|
|
- result.append(LESS_THAN_20[Character.getNumericValue(number.charAt(0))]).append(" cent");
|
|
|
- } else {
|
|
|
- int tens = Character.getNumericValue(number.charAt(0));
|
|
|
- int ones = Character.getNumericValue(number.charAt(1));
|
|
|
- if (tens > 0) {
|
|
|
- result.append(TENS[tens]).append(" ");
|
|
|
- }
|
|
|
- if (ones > 0) {
|
|
|
- result.append(LESS_THAN_20[ones]).append(" ");
|
|
|
+ int i = 0;
|
|
|
+ while (num > 0) {
|
|
|
+ if (num % 1000 != 0) {
|
|
|
+ if ("THOUSAND".equals(THOUSANDS[i])) {
|
|
|
+ result.insert(0, helper(num % 1000) + THOUSANDS[i] + " ");
|
|
|
+ } else {
|
|
|
+ result.insert(0, helper(num % 1000) + THOUSANDS[i] + " AND ");
|
|
|
+ }
|
|
|
}
|
|
|
+ num /= 1000;
|
|
|
+ i++;
|
|
|
}
|
|
|
return result.toString().trim();
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ private static String helper(int num) {
|
|
|
+ if (num == 0) return " ";
|
|
|
+ else if (num < 20) return LESS_THAN_20[num] + " ";
|
|
|
+ else if (num < 100) return TENS[num / 10] + "-" + helper(num % 10);
|
|
|
+ else return LESS_THAN_20[num / 100] + " HUNDRED AND " + helper(num % 100);
|
|
|
+ }
|
|
|
+
|
|
|
private static String convert(long number) {
|
|
|
if (number == 0) {
|
|
|
return "ZERO";
|