`
shaoyj84
  • 浏览: 2107 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

人民币大写转换

 
阅读更多
import java.math.BigDecimal;

/**
 * @author shaoyaojie 2010-08-20
 *
 */
public class ChineseMoney {

    // 数字表示
    private static char[] CHINESE_DIGIT= { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };

    // 单位无限大
    private static final String POS[] = new String[] { "分", "角", "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿" };

    /**
     * 将中文金额转换为数字金额(零~千兆)
     * 
     * @param chineseMoney
     *            中文金额字符串
     * @return 数字金额
     */
    public static String covertToDigital(String chineseMoney) {
        // 条件判断
        int yuanIndex = chineseMoney == null ? -1 : chineseMoney.indexOf('圆');
        if (yuanIndex < 0) {
            return "";
        }
        if (yuanIndex > 31) {
            return "数值过大!";
        }

        char nowChar;

        BigDecimal iResult = BigDecimal.ZERO;
        // 金额单位(圆,万,亿,兆)
        BigDecimal iMoneyUnit = BigDecimal.ZERO;
        // 数据单位
        BigDecimal iDataUnit = BigDecimal.ZERO;
        // 一万
        BigDecimal bdcTenThousand = new BigDecimal("10000");

        char[] moneyChar = chineseMoney.toCharArray();
        for (int i = moneyChar.length - 1; i > -1; i--) {
            nowChar = moneyChar[i];
            // 将中文数字字符转为 数字字符
            for (int k = CHINESE_DIGIT.length - 1; k >= 0; k--) {
                if (nowChar == CHINESE_DIGIT[k]) {
                    nowChar = (char) ('0' + k);
                    break;
                }
            }

            if (nowChar >= '0' && nowChar <= '9') {
                iResult = iResult.add(iDataUnit.multiply(new BigDecimal(nowChar - '0')));
            } else if (nowChar == '圆') {
                // 1
                iDataUnit = iMoneyUnit = BigDecimal.ONE;
            } else if (nowChar == '万') {
                // 10000
                iDataUnit = iMoneyUnit = bdcTenThousand;
            } else if (nowChar == '亿') {
                // 10000*10000
                iDataUnit = iMoneyUnit = bdcTenThousand.multiply(bdcTenThousand);
            } else if (nowChar == '兆') {
                // 10000*10000*1000
                iDataUnit = iMoneyUnit = bdcTenThousand.multiply(bdcTenThousand).multiply(bdcTenThousand);
            } else if (nowChar == '拾') {
                iDataUnit = iMoneyUnit.multiply(BigDecimal.TEN);
            } else if (nowChar == '佰') {
                iDataUnit = iMoneyUnit.multiply(new BigDecimal("100"));
            } else if (nowChar == '仟') {
                iDataUnit = iMoneyUnit.multiply(new BigDecimal("1000"));
            } else if (nowChar == '角') {
                iDataUnit = new BigDecimal("0.1");
            } else if (nowChar == '分') {
                iDataUnit = new BigDecimal("0.01");
            }
        }

        return iResult.toString();
    }

    /**
     * 将数字金额转换为中文金额(无限大)
     * 
     * @param money
     *            数字金额
     * @return 中文金额字符串
     */
    public String change(String money) {

        BigDecimal bdMoney = BigDecimal.ZERO;
        try {
            // 检查数字正确性,移除首位空格
            bdMoney = new BigDecimal(money);
        } catch (Exception ex) {
            throw new IllegalArgumentException("不是正确的数字金额!");
        }
        // 检查小数位长度
        money = bdMoney.toString();
        if (money.indexOf('.') >= 0 && (money.length() - money.indexOf('.')) > 3) {

            throw new IllegalArgumentException("不是正确的数字金额!");
        }

        // 得到纯净的 '0'~'9'的字符串
        money = bdMoney.multiply(new BigDecimal("100")).abs().toString();
        money = money.indexOf('.') >= 0 ? money.substring(0, money.indexOf('.')) : money;

        char nowChar;
        String posStr;
        int posIndex;
        boolean oldCharIsZero = true;
        StringBuilder stb = new StringBuilder();

        for (int i = money.length() - 1; i >= 0; i--) {

            nowChar = money.charAt(i);
            posIndex = money.length() - 1 - i;
            // 如果长度超出了表达长度,则从"拾", "佰", "仟", "万", "拾", "佰", "仟", "亿"重新统计
            posIndex = posIndex >= POS.length ? (posIndex - 3) % (POS.length - 3) + 3 : posIndex;
            posStr = POS[posIndex];

            if (nowChar == '0') {
                if (posStr == "亿" || posStr == "万" || posStr == "元") {
                    stb.append(posStr);
                }
                // 如果旧字符不是0,则追加零,否则 当前的零就不考虑
                if (!oldCharIsZero) {
                    stb.append("零");
                }
                oldCharIsZero = true;
            } else {
                oldCharIsZero = false;
                stb.append(posStr).append(CHINESE_DIGIT[nowChar - '0']);
            }
        }

        if (bdMoney.signum() == -1) {
            stb.append("负");
        }
        stb.reverse();
        String ret = stb.toString();
        while(ret.indexOf("亿万")>=0){
            ret = ret.replace("亿万", "亿");
        }
        ret = ret.indexOf("分") < 0 ? ret + "整" : ret;

        return ret;
    }
}
分享到:
评论
2 楼 shaoyj84 2012-02-26  
呵呵,自己写的玩玩的。
1 楼 bardo 2011-04-17  
建议看看这一个

http://bardo.iteye.com/blog/983559

相关推荐

    python实现人民币大写转换

    本文实例为大家分享了python实现人民币大写转换的具体代码,供大家参考,具体内容如下 #!/usr/bin/python # -*- coding:utf-8 -*- # ********* 转换方法介绍 ********* # 将需要转换的数字从右向左,每4位分成一个...

    人民币大写转换程序(非常好用)

    在IT领域,人民币大写转换是一项常见的编程任务,特别是在财务软件或者银行系统中。这个程序设计的目的是将阿拉伯数字形式的人民币金额转换成规范的大写汉字形式,以便于财务报表的标准化和防止篡改。在会计和金融...

    java程序实现人民币大写转换

    这是一个把人民币数字转换成大写的java程序

    人民币大写转换工具,方便不会书写大写人民的人使用

    "人民币大写转换工具"的使用方法通常是输入或粘贴你要转换的数字,然后点击转换按钮,系统会自动生成对应的大写汉字。这样的工具不仅适用于报销单据的填写,还适用于合同、支票等各种财务文件的制作。它极大地提高了...

    excel中人民币大写转换器

    双击"大写转换.EXE",文件将解压到:C:\Program Files\Microsoft Office\Office\XLStart下面,有一个文件daxie.xla.(第一次可能看不到,再双击"大写转换.EXE"即可看到路径!!!!) 双击daxie.xla,会提示宏安全性设置,(调低...

    人民币大写转换的程序源码

    ### 人民币大写转换程序解析 #### 一、概述 在财务系统中,为了确保资金安全及法律合规性,常需要将数字金额转换为大写形式。本篇将基于提供的程序代码片段,深入分析实现人民币金额(不超过亿元)大写转换的逻辑...

    delphi源码人民币大写转换.txt

    ### Delphi 源码人民币大写转换解析 在日常财务处理、银行系统以及各种会计应用中,将数字金额转换成大写中文金额是一项常见需求。这种转换在合同签署、发票开具等正式场合中尤为重要,因为大写金额可以有效地防止...

    人民币大写转换器

    《人民币大写转换器》是一款专门用于将阿拉伯数字形式的人民币金额转换成规范的大写汉字表示的工具。在金融、会计等领域,为了确保交易的准确性和合法性,通常需要使用大写汉字来表示金额,避免因小数点或零的误读...

    java人民币大写转换

    java人民币大写转换例子。

    人民币大写转换js,精确到角

    "人民币大写转换js"是一个常见的需求,它涉及到JavaScript编程语言中的字符串处理和数字格式化技术。下面将详细阐述这个主题。 首先,人民币大写转换通常涉及到以下字符:零(0)、壹(1)、贰(2)、叁(3)、肆...

    人民币大写转换C#代码,运行在服务端的

    标题提到的是一个使用C#编写的程序,用于实现人民币大写转换,并且这个程序是设计在服务端运行的。下面我们将详细讨论这个知识点。 首先,人民币大写转换是将阿拉伯数字(如1, 2, 3...)转换为中文大写数字(如壹、...

    Delphi 人民币大写转换及朗读工具(源代码)

    本项目“Delphi 人民币大写转换及朗读工具”是一个实用的软件示例,它结合了财务计算与语音合成技术,为用户提供便捷的人民币金额转换服务。 一、人民币大写转换 在财务工作中,人民币金额通常需要以大写形式表示...

    sql 人民币大写转换函数

    根据给定的SQL函数“MoneyToCapital”,我们可以深入解析并理解其如何实现将人民币数值转换为中文大写的功能。此函数不仅关注基本的数字转换,还考虑了进位处理、精度设定以及数值范围的限制,确保了转换结果的准确...

    人民币大写转换器.exe

    人民币大写转换器.exe

    人民币数字转换成汉字大写

    人民币数字转换成汉字大写 android Java 运行效率

    jsp页面调用applet实现人民币的大小写转换.docx

    通过JSP页面调用Applet实现人民币的大小写转换,可以实时地将用户输入的金额转换为大写或小写形式。该实现方法可以应用于电子商务、银行等领域,提供了一个便捷的金额转换工具。 六、技术要点 * 使用JSP页面调用...

Global site tag (gtag.js) - Google Analytics