关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » JAVA »Java实现人民币大写代码解析

    Java实现人民币大写代码解析

    2015-12-28 00:00:00 出处:ericquan8
    分享

    想要实现人民币大写,在发票等场景中使用?? 1234.56显示为:壹仟贰佰叁拾肆元伍角陆分,那就往下看看吧!

    本程序可以实现 0 到 9999 9999 9999.994 以内的人民币大写转换,精确到分

    经典测试数据:

    0

    希望转换出来的结果为:

    零元零角零分

    1234

    希望转换出来的结果为:

    壹仟贰佰叁拾肆元零角零分

    9999

    希望转换出来的结果为:

    玖仟玖佰玖拾玖元零角零分

    1234.5

    希望转换出来的结果为:

    壹仟贰佰叁拾肆元伍角零分

    1234.9

    希望转换出来的结果为:

    壹仟贰佰叁拾肆元玖角零分

    1234.56

    希望转换出来的结果为:

    壹仟贰佰叁拾肆元伍角陆分

    1234.99

    希望转换出来的结果为:

    壹仟贰佰叁拾肆元玖角玖分

    1234.994

    希望转换出来的结果为:

    壹仟贰佰叁拾肆元玖角玖分

    1234.999

    希望转换出来的结果为:

    壹仟贰佰叁拾伍元零角零分

    999999999999.999

    希望转换出来的结果为:

    数据过大,无法进行转换,请重新输入!

    程序源码如下,含注释:

    package com.tfj.algorithm;
    
    import java.util.Scanner;
    
    public class RenMingBi {
        private boolean zero;
        String[] strHan = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
        String[] moneyCount = { "", "拾", "佰", "仟" };
    
        RenMingBi() {
            zero = false;
        }
    
        private String[] divide(double digitalRmbValue) {
            // 处理整数
            long intPart = (long) (digitalRmbValue);
            // 处理小数,把小数转换成整数形式处理,并进行四舍五入,此时小数四舍五入之后为100的应该另外加一层处理
            long decimalPart = Math
                    .round((double) Math.round((digitalRmbValue - intPart) * 10000) / 100);
            // System.out.println("整数部分为:" + intPart + "小数部分为:" + (digitalRmbValue - intPart));
            if (decimalPart == 100) {
                intPart += 1;
            }
            // System.out.println("四舍五入之后整数部分为:" + intPart + "小数部分为:" + decimalPart);
    
            String strIntPart = "";
            if (intPart == 0)
                strIntPart = "0";
            else {
                strIntPart = "" + intPart;
            }
    
            String strDecimalPart = "";
            if (decimalPart < 10 && decimalPart >= 0)
                strDecimalPart = "0" + decimalPart;
            else {
                strDecimalPart = "" + decimalPart;
            }
            // 处理输入为0的时候
            if (intPart == 0 && decimalPart == 0) {
                zero = true;
            }
            // System.out.println("准换为String后,整数部分为:" + strIntPart + "小数部分为:" + strDecimalPart);
            return new String[] { strIntPart, strDecimalPart };
        }
    
        // 用来转换小数部分
        private String transDecimal(String str) {
            if (str.equals("100") || str.equals("00")) {
                return "零角零分";
            } else {
                String strResult;
                char[] strRmb = new char[20];
                strRmb = str.toCharArray();
                if (strRmb[0] == '0' && strRmb[1] == '0') {
                    strResult = "";
                } else {
                    int dm = strRmb[0] - '0';
                    int dn = strRmb[1] - '0';
                    strResult = strHan[dm] + "角" + strHan[dn] + "分";
                }
                return strResult;
            }
        }
    
        // 用来转换整数部分
        private String transInt(String str) {
            char[] firstFourBitRmb = new char[20];
            firstFourBitRmb = str.toCharArray();
            int len = firstFourBitRmb.length;
            String strResult = "";
            for (int i = 0; i < len; i++) {
                /**
                 * 这里开启之后会显示成通俗易懂的格式,例如1001,会转化为:壹仟零壹元,而不是:壹仟零佰零拾壹元, 但我希望得到的是后面这种,因为发票所需显示的就是后面这种
                 **/
    
                // if (firstFourBitRmb[i] == '0' && i < len) {
                // boolean zeroFlag = false;
                // while (i < len && firstFourBitRmb[i] == '0') {
                // zeroFlag = true;
                // i++;
                // }
                // if (i != len && zeroFlag == true)
                // strResult += "零";
                // i--;
                // } else {
                // int m = firstFourBitRmb[i] - '0';
                // strResult += strHan[m] + moneyCount[len - i - 1];
                // }
                int m = firstFourBitRmb[i] - '0';
                strResult += strHan[m] + moneyCount[len - i - 1];
            }
            return strResult;
        }
    
        public String transComb() {
            String[] strTempRmb = new String[2];
            double strValue = 0D;
            Scanner sc = new Scanner(System.in);
    
            System.out.println("请输入具体金额,结果会精确到分:");
            strValue = sc.nextDouble();
            RenMingBi nr = new RenMingBi();
            strTempRmb = nr.divide(strValue);
            // 转换小数部分
            String result1 = nr.transDecimal(strTempRmb[1]);
    
            // 转换整数部分
            String result2 = "";
            int len = strTempRmb[0].length();
            if (len > 12)
                return "数据过大,无法进行转换,请重新输入!";
            else {
                if (len >= 9) {
                    String strBit1 = strTempRmb[0].substring(0, len - 8);
                    String strBit2 = strTempRmb[0].substring(len - 8, len - 4);
                    String strBit3 = strTempRmb[0].substring(len - 4, len);
                    String strResult1 = nr.transInt(strBit1) + "亿";
                    String strResult2 = nr.transInt(strBit2) + "万";
                    String strResult3 = nr.transInt(strBit3) + "元";
                    result2 = strResult1 + strResult2 + strResult3;
                } else if (len >= 5) {
                    String strBit1 = strTempRmb[0].substring(0, len - 4);
                    String strBit2 = strTempRmb[0].substring(len - 4, len);
                    String strResult1 = nr.transInt(strBit1) + "万";
                    String strResult2 = nr.transInt(strBit2) + "元";
                    result2 = strResult1 + strResult2;
                } else if (len >= 1) {
                    if (nr.zero == true) {
                        result2 = "零元";
                    } else
                        result2 = nr.transInt(strTempRmb[0]) + "元";
                }
                return result2 + result1;
            }
        }
    
        public static void main(String[] args) {
            RenMingBi rmb = new RenMingBi();
            while (true) {
                System.out.println(rmb.transComb());
            }
        }
    }
    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    抖音安全与信任开放日:揭秘推荐算法,告别单一标签依赖

    ultraedit编辑器打开文件时,总是提示是否转换为DOS格式,如何关闭?

    Cornell大神Kleinberg的经典教材《算法设计》是最好入门的算法教材

    从 Microsoft 下载中心安装 Windows 7 SP1 和 Windows Server 2008 R2 SP1 之前要执行的步骤

    Llama 2基于UCloud UK8S的创新应用

    火山引擎DataTester:如何使用A/B测试优化全域营销效果

    腾讯云、移动云继阿里云降价后宣布大幅度降价

    字节跳动数据平台论文被ICDE2023国际顶会收录,将通过火山引擎开放相关成果

    这个话题被围观超10000次,火山引擎VeDI如此解答

    误删库怎么办?火山引擎DataLeap“3招”守护数据安全

    IT头条

    平替CUDA!摩尔线程发布MUSA 4性能分析工具

    00:43

    三起案件揭开侵犯个人信息犯罪的黑灰产业链

    13:59

    百度三年开放2.1万实习岗,全力培育AI领域未来领袖

    00:36

    工信部:一季度,电信业务总量同比增长7.7%,业务收入累计完成4469亿元

    23:42

    Gartner:2024年全球半导体营收6559亿美元,AI助力英伟达首登榜首

    18:04

    技术热点

    iOS 8 中如何集成 Touch ID 功能

    windows7系统中鼠标滑轮键(中键)的快捷应用

    MySQL数据库的23个特别注意的安全事项

    Kruskal 最小生成树算法

    Ubuntu 14.10上安装新的字体图文教程

    Ubuntu14更新后无法进入系统卡在光标界面解怎么办?

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。