想要实现人民币大写,在发票等场景中使用?? 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());
        }
    }
}

Java实现人民币大写代码解析的更多相关文章

  1. Java实现人民币大写精讲

    想要实现人民币大写,在发票等场景中使用?? 1234.56显示为:壹仟贰佰叁拾肆元伍角陆分,那就往下看看吧! 本程序可以实现 0 到 9999 9999 9999.994 以内的人民币大写转换,精确到 ...

  2. Java生产消费者模型——代码解析

    我们将生产者.消费者.库存.和调用线程的主函数分别写进四个类中,通过抢夺非线程安全的数据集合来直观的表达在进行生产消费者模型的过程中可能出现的问题与解决办法. 我们假设有一个生产者,两个消费者来共同抢 ...

  3. java笔记 -- java简单结构代码解析及注释

    结构代码解析 public class FirstSample { public static void main(String[] args) { System.out.println(2.0-1. ...

  4. java集合框架之java HashMap代码解析

     java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/arti ...

  5. Java二进制指令代码解析

    http://www.blogjava.net/DLevin/archive/2011/09/13/358497.html http://blog.csdn.net/sum_rain/article/ ...

  6. java代码解析二维码

    java代码解析二维码一般步骤 本文采用的是google的zxing技术进行解析二维码技术,解析二维码的一般步骤如下: 一.下载zxing-core的jar包: 二.创建一个BufferedImage ...

  7. java 将一个正整数翻译成人民币大写的读法

    程序如下: import java.lang.StringBuffer; /** 给定一个浮点数,将其装换成人民币大写的读法 88.5:捌十捌元零伍角 */ public class Num2Rmb ...

  8. Java 实现对Sql语句解析

    原文地址:http://www.cnblogs.com/zcftech/archive/2013/06/10/3131286.html 最近要实现一个简易的数据库系统,除了要考虑如何高效的存储和访问数 ...

  9. Java中的static关键字解析

    Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...

随机推荐

  1. SQL Server死锁日志各字段含义

    使用跟踪标记 1204 --打开跟踪标记 DBCC TRACEON (1204,-1) --关闭跟踪标记 DBCC TRACEOFF (1204,-1) 处于死锁状态时,跟踪标记 1204 在等待的线 ...

  2. Oracle主键自动生成_表and存储过程

    -- Create table create table T_EB_SYS_DN_SEQUENCE_CONFIG ( sequence_id VARCHAR2(36) default sys_guid ...

  3. 最终版-perl工具解析数据库的报告文件0120

    ********************需要根据自己的实际环境修改哦**************************** ******************** 1. 收集awr报告样本   a ...

  4. [LeetCode OJ] Distinct Subsequences

    Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...

  5. 记一个问题的AC

    今天突然做一道LCT的染色问题的时候突然想到一个两个月前一道没有AC的题目. 链接 大意是,给一个长度为10^4的序列,最多有255个不同的数字,有最多10^5次方个询问,对于每个询问 l,r 输出[ ...

  6. bootstrap学习--什么是bootstrap

    2011年,twitter的“一小撮”工程师为了提高他们内部的分析和管理能力,用业余时间为他们的产品构建了一套易用.优雅.灵活.可扩展的前端工具集--BootStrap.Bootstrap由MARK ...

  7. js 强制转换

    强制转换为布尔类型: <script> var text =Boolean(0) //=>以下转换的类型都为false text = Boolean(0.0) text = Bool ...

  8. JQUERY 键盘事件

    一 一.首先需要知道的是: 1.keydown()keydown 事件会在键盘按下时触发. 2.keypress()keypress 事件会在敲击按键时触发,我们可以理解为按下并抬起同一个按键. 3. ...

  9. 关于android:configChanges的属性

    一般在AndroidManifest.xml文件中都没有使用到android:configChanges="keyboardHidden|orientation"配置,当然还是很有 ...

  10. 我和CPP的第二次约会

    1.变量之间的运算形式依赖于变量的数据类型,如i = i + j;当 i 和 j 是整型或者浮点型,则代表两个数的相加,如果是第一章所说的Sales_item类型,那么就是这两个变量的成分相加(如果书 ...