原标题:Java实现人民币大写代码解析
想要实现人民币大写,在发票等场景中使用?? 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[] pide(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.pide(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()); } } }
相关:
面向对象编程,面向设计模式编程(亦即设计模式),面向接口编程,面向模板编程(亦即泛型编程),面向函数
目标读者:理解HTTP协议,对称和非对称加密,想要了解HTTPS协议的工作原理。读完本文,你能明白什么是HTTPS
介绍如果你关注安卓开发的最新趋势,你可能已经听说过 Realm 。Realm是一个可以替代SQLite以及ORMlibraries
源码推荐(12.28B):降低代码耦合快速开发框架,一句代码将图片切成两张
分离代码,降低代码耦合快速开发框架(上传者:不可数的爱)根据https://github.com/Akateason/XTTableDataso
石工布局瀑布流(上传者:wkcao)石工布局瀑布流,用UICollectionView实现滑动打分,通过在星星上面滑动,给予
瀑布流(上传者:herodys)网络请求数据,带collectionView头部,上拉加载,下拉刷新QQ界面(上传者:17941160
源码推荐(12.22B):不用写代码的侧滑返回,仿天猫网易新闻导航栏效果
不用写代码的侧滑返回(上传者:19971017_木木)任何代码不用写,只需要继承一个类,即可以侧滑返回!仿天猫,
源码推荐(12.23B):圆形方形两种方式的图片裁剪,滑动视图
圆形方形两种方式的图片裁剪(上传者:长安乱1993)实现圆形 方形两种方式的图片裁剪,支持自定义裁剪大小,支持
作者:黄凯背景最近在做一个预告片类的APP,在预告片的编辑模块有一个预告片倒序文件的需求,这个和倒序播放的需求
源码推荐(12.25B):自定义tabBar,自动布局+cell高度自适应
自定义tabBar(上传者:小妞,不要跑)自定义tabBar,集成简单,使用方便自动布局+cell高度自适应(上传者:iOS