涉及到數字中文表示的一些工具函數

package kellerdu.util;

import java.util.Hashtable;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.text.NumberFormat;
import java.util.Currency;

/**
 *涉及到數字中文表示的一些工具函數
 *
 * @version 1.0
 */
public class NumCN {
    private static Hashtable hy = null;
    private static final String[] san = {"", "拾", "百", "千"};
    private static final String[] wan = {"", "萬", "億"};
    private static final SimpleDateFormat sdf = new SimpleDateFormat(
            "yyyy年M月d日 HH:hh EE", Locale.CHINA);
    private static final NumberFormat nf = NumberFormat.getCurrencyInstance(
            Locale.CHINA);
    private static final String SAMBOL = Currency.getInstance(Locale.CHINA).
                                         getSymbol();

    private NumCN() {
    }


    /**
     * isCurrency爲true,數字全部用大寫表示
     * @param isCurrency boolean
     * @return NumCN
     */
    public static NumCN getInstance(boolean isCurrency) {
        hy = new Hashtable();
        if (isCurrency) {
            hy.put("0", "零");
            hy.put("1", "壹");
            hy.put("2", "貮");
            hy.put("3", "叄");
            hy.put("4", "肆");
            hy.put("5", "伍");
            hy.put("6", "陸");
            hy.put("7", "柒");
            hy.put("8", "捌");
            hy.put("9", "玖");
        } else {
            hy.put("0", "零");
            hy.put("1", "一");
            hy.put("2", "二");
            hy.put("3", "三");
            hy.put("4", "四");
            hy.put("5", "五");
            hy.put("6", "六");
            hy.put("7", "七");
            hy.put("8", "八");
            hy.put("9", "九");
        }

        return new NumCN();
    }

    public static NumCN getInstance() {
        return NumCN.getInstance(false);
    }

    /**
     * 貨幣數字表示
     * @param f double
     * @return String
     * @throws Exception
     */

    public String toCurrency(float f) {
        String s = nf.format(f);
        return s;
    }

    /**
     * 貨幣大寫數字表示
     * @param f double
     * @return String
     * @throws Exception
     */
    public String toCNCurrency(double f) throws Exception {
        if (f < 0) {
            throw new Exception("Can not less then 0!");
        }
        int i = (int) f;
        String s = SAMBOL + translate((long) i) + "元";
        double ff = f - i;
        if (ff > 0) {
            ff *= 10;
            long fi = Math.round(ff);
            if (ff >= 1) {
                if (Math.abs(ff - fi) < 1e-3) {
                    s += (hy.get(String.valueOf(Math.round(ff))) + "角");
                } else {
                    s += (hy.get(String.valueOf(Math.round(ff) - 1)) + "角");
                }
            }
            if (Math.abs(ff - fi) > 1e-3) {
                ff = (ff - (int) ff) * 10;
                fi = Math.round(ff);
                if (ff >= 1) {
                    if (Math.abs(ff - fi) < 1e-3) {
                        s += (hy.get(String.valueOf(Math.round(ff))) + "分");
                    } else {
                        s += (hy.get(String.valueOf(Math.round(ff) - 1)) + "分");
                    }
                }
            }
        }
        return s+"整";
    }

    /**
     * 翻譯,精度六位
     * @param f double
     * @return String
     */
    public String translate(double f) {
        String result = "";
        if (f < 0) {
            result = "負";
            f = Math.abs(f);
        }
        return result + translate((int) f) + con(f - ((int) f));
    }

    /**
     * 翻譯小數部分,精度六位
     * @param f double
     * @return String
     */
    private String con(double f) {
        String result = "點";
        f = f * 10;
        while (f < 1) {
            result += "零";
            f = f * 10;
        }
        int i = (int) Math.round(f);
        if (i < 10) {
            result += hy.get(String.valueOf(i));
        } else {
            result += hy.get(String.valueOf(9));
        } while (Math.abs(f - i) > 1e-6) {
            f = (f - (int) f) * 10;
            i = (int) Math.round(f);
            if (i < 10) {
                result += hy.get(String.valueOf(i));
            } else {
                result += hy.get(String.valueOf(9));
            }

        }
        return result;
    }

    /**
     * 翻譯
     * @param l long
     * @return String
     */
    public String translate(long l) {
        String result = "";
        boolean isFu = l < 0;
        l = Math.abs(l);
        String s = String.valueOf(l);
        int j = 0;
        for (int i = s.length(); i > 0; i -= 4) {
            int be = i - 4;
            be = be < 0 ? 0 : be;
            String m = "";
            if ((j % 4) == 0) {
                if (j != 0) {
                    //System.out.println(s+":"+be);
                    if ((j % 8) == 0) {
                        m = "億";
                    } else {
                        m = "萬";
                    }
                }
            }
            //不能出現8億萬這種情況
            if ((m.equals("億") && result.charAt(0) == '萬')) {
                result = result.replaceFirst("萬", "億");
                m = "";
            }
            result = qian(s.substring(be, i)) + m + result;
            j += 4;
        }
        if (isFu) {
            result = "負" + result;
        }
        return result;
    }

    /**
     * 翻譯9999-0000
     * @param s String
     * @return String
     */
    private String qian(String s) {
        String r = "";
        char[] cs = new char[1];
        boolean find = false;
        for (int i = s.length() - 1; i > -1; i--) {
            //從右數,找到不是0的一位
            if (!find) {
                if (s.charAt(i) == '0') {
                    continue;
                } else {
                    find = true;
                }
            }
            cs[0] = s.charAt(i);
            if (cs[0] == '0') {
                if (s.charAt(i + 1) == '0' || i == 0) {
                    continue;
                } else {
                    r = (String) hy.get(new String(cs)) + r;
                }
            } else {
                r = (String) hy.get(new String(cs)) + san[s.length() - 1 - i] +
                    r;
            }
        }
        if ((!find) && r.equals("")) {
            r = (String) hy.get("0");
        }
        return r;
    }


    public String formate(Date date) {
        return sdf.format(date);
    }


}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章