/**
* 文件名:CommonUtils.java
*
* 版本信息:
* 日期:2019年4月13日
* Copyright 足下 Corporation 2019
* 版权所有
*
*/
package com.freshport.freight.customs.utils;
import com.freshport.freight.common.util.CommonUtils;
/**
*
* 项目名称:ff-customs
* 类名称:NumToEnlish
* 类描述:数字转英文
* 创建人:yangx
* 创建时间:2020年3月26日 上午10:01:19
* 修改人:yangx
* 修改时间:2020年3月26日 上午10:01:19
* 修改备注:
* @version
*
*/
public class NumToEnlish {
// 基本数词表
public static final String[] enNum = { "ZERO", "ONE", "TOW", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT",
"NINE", "TEN", "ELEVEN", "TWELVE", "THIRTEEN", "FOURTEEN", "FIFTEEN", "SIXTEEN", "SEVENTEEN", "EIGHTEEN",
"NINETEEN", "TWENTY", "", "", "", "", "", "", "", "", "", "THIRTY", "", "", "", "", "", "", "", "", "",
"FOURTY", "", "", "", "", "", "", "", "", "", "FIFTY", "", "", "", "", "", "", "", "", "", "SIXTY", "", "",
"", "", "", "", "", "", "", "SEVENTY", "", "", "", "", "", "", "", "", "", "EIGHTY", "", "", "", "", "", "",
"", "", "", "NINETY" };
// 单位表
public static final String[] enUnit = { "HUNDRED", "THOUSAND", "MILLION", "BILLION", "TRILLION", "QUINTILLION" };
public static String numToEnlish(String num) {
if (CommonUtils.isEmpty(num)) {
return "";
}
String int_part = "";
String dec_part = "";
int i = num.indexOf(".");
if (i == -1) {
int_part = num;
} else {
int_part = num.substring(0, i);
dec_part = num.substring(i + 1, num.length());
}
return intAnalyze(int_part) + decAnalyze(dec_part);
}
private static String intAnalyze(String num) {
if (num.length() == 0) {
return enNum[0];
}
// 按3位分割分组
int count = (num.length() % 3 == 0) ? num.length() / 3 : num.length() / 3 + 1;
if (count > enUnit.length) {
return "too big";
} // 判断组单位是否超过,
// 可以根据需求适当追加enUnit
String[] group = new String[count];
for (int i = num.length(), j = group.length - 1; i > 0; i -= 3) {
group[j--] = num.substring(Math.max(i - 3, 0), i);
}
StringBuilder buf = new StringBuilder(); // 结果保存
for (int i = 0; i < count; i++) { // 遍历分割的组
int v = Integer.valueOf(group[i]);
if (v >= 100) { // 因为按3位分割,所以这里不会有超过999的数
buf.append(enNum[v / 100]).append(" ").append(enUnit[0]).append(" ");
v = v % 100; // 获取百位,并得到百位以后的数
if (v != 0) {
buf.append("AND ");
} // 如果百位后的数不为0,则追加and
}
if (v != 0) { // 前提是v不为0才作解析
if (v < 20 || v % 10 == 0) {
// 如果小于20或10的整数倍,直接取基本数词表的单词
buf.append(enNum[v]).append(" ");
} else { // 否则取10位数词,再取个位数词
buf.append(enNum[v - v % 10]).append(" ");
buf.append(enNum[v % 10]).append(" ");
}
if (i != count - 1) { // 百位以上的组追加相应的单位
buf.append(enUnit[count - 1 - i]).append(" ");
}
}
}
return buf.toString().trim(); // 返回值
}
private static String decAnalyze(String num) {
if (num.length() == 0) {
return "";
}
StringBuilder buf = new StringBuilder();
buf.append(" CENTS ");
int v = Integer.valueOf(num);
if (v != 0) { // 前提是v不为0才作解析
if (v < 20 || v % 10 == 0) {
// 如果小于20或10的整数倍,直接取基本数词表的单词
buf.append(enNum[v]).append(" ");
} else { // 否则取10位数词,再取个位数词
buf.append(enNum[v - v % 10]).append(" ");
buf.append(enNum[v % 10]).append(" ");
}
}
return buf.toString();
}
public static void main(String[] args) {
System.out.println(numToEnlish("2139.12"));
}
}