数字转英文带小数

/**    
 * 文件名: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"));
    }
}
 

发布了15 篇原创文章 · 获赞 1 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览