`
keller
  • 浏览: 48952 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

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);
    }


}

分享到:
评论

相关推荐

    数字信号处理中常用的matlab工具箱函数简介-数字信号处理中常用的matlab工具箱函数简介.pdf

    数字信号处理中常用的matlab工具箱函数简介 摘 要:本文就数字信号处理中所涉及到的一些典型MATLAB工具箱函数进行了简要的介绍,希望能为专门从事数字信号处理的人士,在使用MATLAB这门应用性工具方面,提供一些适当...

    数字信号处理自编制函数-数字信号处理自编函数.zip

    这可能涉及到MATLAB的并行计算工具箱或实时工作流。 7. **算法优化**:自编函数可能针对特定硬件平台进行了优化,例如,使用MATLAB的“C/C++代码生成”功能将信号处理算法转换为可部署的嵌入式代码。 8. **自定义...

    JavaScript数字格式化函数

    这通常涉及到字符串处理和数学运算。本篇文章将深入探讨JavaScript中的数字格式化函数及其应用。 一、基本数字格式化 1. `toFixed()`:这个内置方法用于将数字转换为字符串,并保留指定位数的小数。例如: ```...

    数字信号处理的函数库

    在数字信号处理领域,函数库扮演着至关重要的角色,它们为开发者提供了预定义的函数,以便高效、便捷地实现各种处理任务。C语言作为一种广泛使用的编程语言,因其效率高、可移植性强,常被用于开发数字信号处理软件...

    F05/F10/F20型数字合成函数信号发生器/计数器使用说明书

    总的来说,F05/F10/F20型数字合成函数信号发生器/计数器是一款强大的测试工具,它的多功能性和高精度使其在电子工程和科学研究中扮演着不可或缺的角色。通过深入理解和熟练掌握本手册中的内容,用户将能够充分利用该...

    数字信号处理中常用的matlab工具箱函数简介

    本文主要介绍MATLAB中数字信号处理工具箱中的一些常用函数。 #### MATLAB工具箱与数字信号处理 ##### 1. 巴特沃思低通模拟滤波器设计:`butter` **函数原型**: ``` [b,a] = butter(n,Wn) ``` **说明**: - `n`:...

    Axure元件函数窗口函数鼠标函数和数字函数的介绍.pdf

    数字函数则涉及到数字的格式化和转换。toFixed()用于将数字四舍五入到指定的小数位数,如将1.232转换为1.23。toExponential()将数字转换为科学记数法,适合处理较大或较小的数值。toPrecision()则能将数字格式化为...

    数字电子技术:Lecture3 逻辑函数表示方法 .pdf

    在数字电子技术领域中,逻辑函数是描述数字电路行为的基础工具。本次课程内容涉及逻辑代数的基础知识,特别是逻辑函数的不同表示方法及其相互转换,最小项和最大项的概念,以及逻辑函数的标准形式和形式变换。 首先...

    Delphi实现数字与汉字的转换

    在数字与汉字转换中,我们通常涉及到的是数字到汉字的大写数字转换,这是因为在中文环境下,大写的汉字数字常用于正式的财务报告和发票中,以增加数据的可读性和准确性。例如,1 对应 "壹",2 对应 "贰",以此类推,...

    数字图像处理工具

    "冈萨雷斯 数字图像处理 函数工具"是这个领域内广为使用的工具集,它为研究人员和工程师提供了强大的功能,用于处理和分析数字图像。 一、冈萨雷斯的数字图像处理理论基础 罗伯特·C·冈萨雷斯与理查德·E·伍德斯...

    中文数字转换为阿拉伯数字

    标签“数字转换”进一步确认了这是一个涉及数字表示转换的程序设计问题。在PHP中,这类问题通常通过字符串处理函数和条件逻辑来解决。例如,可以定义一个映射表,存储中文数字和阿拉伯数字的对应关系,然后通过遍历...

    基于MATLAB GUI的多功能数字滤波器设计工具:选择IIR和FIR类型,定制频谱,多种窗函数选择,基于MATLAB GUI的多功能数字滤波器设计工具:选择IIR与FIR,实时频谱显示,多种窗函数选

    基于MATLAB GUI的多功能数字滤波器设计工具:选择IIR和FIR类型,定制频谱,多种窗函数选择,基于MATLAB GUI的多功能数字滤波器设计工具:选择IIR与FIR,实时频谱显示,多种窗函数选择,基于MATLAB+GUI的数字滤波器设计...

    数字图像处理基本处理函数

    在数字图像处理领域,基本处理函数是至关重要的工具,它们为图像分析、增强和复原提供了基础。本压缩包中的C++源码实现了一系列这样的功能,包括图像的旋转、直方图均衡化以及RGB和HSI颜色空间之间的转换。下面我们...

    图像处理自定义函数一_eveningtah_数字图像处理自定义函数_源码

    本资源"图像处理自定义函数一_eveningtah_数字图像处理自定义函数_源码"提供了一组MATLAB版的数字图像处理自定义函数,适用于进行复杂的图像操作和分析。下面将对这些函数逐一进行详细解释: 1. **bound2eight.m**...

    基于matlab的窗函数法FIR数字滤波器设计

    总结,通过窗函数法设计FIR滤波器是数字信号处理中的基础操作,MATLAB提供了强大的工具来实现这一过程。本程序利用MATLAB的`FIRwin.m`函数,结合不同的窗函数,如海明窗、汉宁窗和布莱克曼窗,为数字信号的滤波提供...

    数字图像处理Matlab版自编函数_ledhro_冈萨雷斯matlab图像处理中的代码_rooflph_matlab图像处理_u

    其中包含了一些自编的函数,这些函数可能与书中介绍的算法对应,同时也提供了不同于书中标准实现的解决方案。 "ledhro"、"rooftlph"和"unravelmatlab"是标签,它们可能是自定义函数名或特定处理流程的简称。"ledhro...

    oracle系统内置函数大全

    Oracle数据库系统内置了大量函数,这些函数可以分为多个类别,例如字符函数、数字函数、日期函数、转换函数、分组函数以及其他辅助函数等。以下是对每个类别中一些常用函数的详细介绍: 字符函数 1. ASCII函数:...

    数字图像处理matlab版本书中源程序及dipum函数工具箱

    《数字图像处理MATLAB版本书中源程序及DIPUM函数工具箱》是一个极其宝贵的资源,专为学习和实践数字图像处理技术的人们提供。这个压缩包涵盖了冈萨雷斯版的《数字图像处理》一书中的所有源代码,以及一个名为DIPUM的...

    控制系统数字仿真与cadSimulink的扩展工具S函数.pptx

    《控制系统数字仿真与CAD Simulink的扩展工具S函数》 S函数是控制系统数字仿真领域中的一个重要工具,它是System Function的缩写,主要用于以非图形化的方式,即通过编程语言(如MATLAB、C、C++、FORTRAN或Ada等)...

Global site tag (gtag.js) - Google Analytics