面试题——————JAVA完成人民币大写转化
人民币大写金额的正确写法:
整数部分:零、壹、贰、叁、肆、伍、陆、柒、捌、玖
小数部分:角、分、厘
数位部分:拾、佰、仟、万、亿、元
注意:
阿拉伯数字小写金额数字中有 “0” 时,中文大写应按照汉语语言规律、金额数字构成和防止涂改的要求进行书写。举例如下:
1、阿拉伯数字中间有 “0” 时,中文大写要写“零”字,如¥1409.50应写成人民币壹仟肆佰零玖元伍角。
2、阿拉伯数字中间连续有几个 “0” 时、中文大写金额中间可以只写一个“零”字,如¥6007.14应写成人民币陆仟零柒元壹角肆分。
3、阿拉伯金额数字万位和元位是 “0” ,或者数字中间连续有几个 “0” ,万位、元位也是 “0” 但千位、角位不是 “0” 时,中文大写金额中可以只写一个零字,也可以不写“零”字,
如¥1680.32应写成人民币壹仟陆佰捌拾元零叁角贰分,或者写成人民币壹仟陆佰捌拾元叁角贰分。又如¥107000.53应写成人民币壹拾万柒仟元零伍角叁分,或者写成人民币壹拾万零柒仟元伍角叁分。
4、阿拉伯金额数字角位是 “0” 而分位不是 “0” 时,中文大写金额“元”后面应写“零”字,如¥16409.02应写成人民币壹万陆仟肆佰零玖元零贰分,又如¥325.04应写成人民币叁佰贰拾伍元零肆分。
思路分析:
- 初始化人民币大写金额,其中数位的顺序是有要求的。
- 对传入的字符串进行校验(非空、特殊字符)
- 判断字符串的长度是否超过了转换范围
- 判断是否存在负数,对负号进行替换
- 分离整数部分和小数部分
- 判断整数部分是否已经达到万
这里使用到了一个StringUtils类和单元测,junit,需要导入依赖
<dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies>
完整代码如下:
public class ConvertUpMoney {//整数部分的人民币大写private static final String[] NUMBERS = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};//数位部分private static final String[] IUNIT = {"元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟"};//小数部分的人民币大写private static final String[] DUNIT = {"角", "分", "厘"};//转成中文的大写金额public static String toChinese(String str) {//判断输入的金额字符串是否符合要求if (StringUtils.isBlank(str) || !str.matches("(-)?[\\d]*(.)?[\\d]*")) {System.out.println("抱歉,请输入数字!");return str;}//判断输入的金额字符串if ("0".equals(str) || "0.00".equals(str) || "0.0".equals(str)) {return "零元";}//判断是否存在负号"-"boolean flag = false;if (str.startsWith("-")) {flag = true;str = str.replaceAll("-", "");}//如果输入字符串中包含逗号,替换为 "." str = str.replaceAll(",", ".");String integerStr;//整数部分数字String decimalStr;//小数部分数字//分离整数部分和小数部分if (str.indexOf(".") > 0) {//整数部分和小数部分integerStr = str.substring(0, str.indexOf("."));decimalStr = str.substring(str.indexOf(".") + 1);} else if (str.indexOf(".") == 0) {//只存在小数部分 .34integerStr = "";decimalStr = str.substring(1);} else { //只存在整数部分 34integerStr = str;decimalStr = "";}//整数部分超出计算能力,直接返回if (integerStr.length() > IUNIT.length) {System.out.println(str + ":超出计算能力");return str;}//整数部分存入数组 目的是为了可以动态的在字符串数组中取对应的值int[] integers = toIntArray(integerStr);//判断整数部分是否存在输入012的情况if (integers.length > 1 && integers[0] == 0) {System.out.println("抱歉,请输入数字!");if (flag) {str = "-" + str;}return str;}boolean isWan = isWanUnits(integerStr);//设置万单位//小数部分数字存入数组int[] decimals = toIntArray(decimalStr);String result = getChineseInteger(integers, isWan) + getChineseDecimal(decimals);//返回最终的大写金额if (flag) {return "负" + result;//如果是负数,加上"负"} else {return result;}}//将字符串转为int数组private static int[] toIntArray(String number) {//初始化一维数组长度int[] array = new int[number.length()];//循环遍历赋值for (int i = 0; i < number.length(); i++) {array[i] = Integer.parseInt(number.substring(i, i + 1));}return array;}//将整数部分转为大写的金额public static String getChineseInteger(int[] integers, boolean isWan) {StringBuffer chineseInteger = new StringBuffer("");int length = integers.length;// 对于输入的字符串为 "0." 存入数组后为 0if (length == 1 && integers[0] == 0) {return "";}for (int i = 0; i < length; i++) {String key = "";//0325464646464if (integers[i] == 0) {if ((length - i) == 13)//万(亿)key = IUNIT[4];else if ((length - i) == 9) {//亿key = IUNIT[8];} else if ((length - i) == 5 && isWan) {//万key = IUNIT[4];} else if ((length - i) == 1) {//元key = IUNIT[0];}if ((length - i) > 1 && integers[i + 1] != 0) {key += NUMBERS[0];}}chineseInteger.append(integers[i] == 0 ? key : (NUMBERS[integers[i]] + IUNIT[length - i - 1]));}return chineseInteger.toString();}//将小数部分转为大写的金额private static String getChineseDecimal(int[] decimals) { //角 分 厘 038 壹分捌厘StringBuffer chineseDecimal = new StringBuffer("");for (int i = 0; i < decimals.length; i++) {if (i == 3) {break;}chineseDecimal.append(decimals[i] == 0 ? "" : (NUMBERS[decimals[i]] + DUNIT[i]));}return chineseDecimal.toString();}//判断当前整数部分是否已经是达到【万】private static boolean isWanUnits(String integerStr) {int length = integerStr.length();if (length > 4) {String subInteger = "";if (length > 8) {subInteger = integerStr.substring(length - 8, length - 4);} else {subInteger = integerStr.substring(0, length - 4);}return Integer.parseInt(subInteger) > 0;} else {return false;}}
代码测试:
- 阿拉伯数字中包含 "0"的测试
- 特殊情况的测试(特殊字符、负数、超过人民币数值范围)。
@Testpublic void test() {String number = "1409.50";String afterStr = ConvertUpMoney.toChinese(number);System.out.println(number + ": " + afterStr);//壹仟肆佰零玖元伍角}@Testpublic void test2() {String number = "6007.14";String afterStr = ConvertUpMoney.toChinese(number);System.out.println(number + ": " + afterStr);//陆仟零柒元壹角肆分}@Testpublic void test3() {String number = "1680.32";String afterStr = ConvertUpMoney.toChinese(number);System.out.println(number + ": " + afterStr);//壹仟陆佰捌拾元叁角贰分}@Testpublic void test4() {String number = "107000.53";String afterStr = ConvertUpMoney.toChinese(number);System.out.println(number + ": " + afterStr);//壹拾万零柒仟元伍角叁分}@Testpublic void test5() {String number = "16409.02";String afterStr = ConvertUpMoney.toChinese(number);System.out.println(number + ": " + afterStr);//壹万陆仟肆佰零玖元零贰分}@Testpublic void test6() {String number = "325.04";String afterStr = ConvertUpMoney.toChinese(number);System.out.println(number + ": " + afterStr);//叁佰贰拾伍元零肆分}@Testpublic void test7() {String number = "-0325.04";String afterStr = ConvertUpMoney.toChinese(number);//抱歉,请输入数字!System.out.println(number + ": " + afterStr);}@Testpublic void test8() {String number = "325#sdr";String afterStr = ConvertUpMoney.toChinese(number);//抱歉,请输入数字!System.out.println(number + ": " + afterStr);//325#sdr: 325#sdr}@Testpublic void test9() {String number = "-34327987";String afterStr = ConvertUpMoney.toChinese(number);//-34327987: 负叁仟肆佰叁拾贰万柒仟玖佰捌拾柒元System.out.println(number + ": " + afterStr);}@Testpublic void test10() {String number = "78934029675923532";System.out.println("长度 :" + number.length());//长度 :17String afterStr = ConvertUpMoney.toChinese(number);//78934029675923532:超出计算能力System.out.println(number + ": " + afterStr);}
图解转换的过程:
整数部分转化人民币大写方法简写
小数部分转换人民币大写方法简写
转换过程:
转换结果:
贰拾叁亿贰仟柒佰捌拾玖万叁仟肆佰壹拾玖元
这里给大家推荐一个人民币金额大写转换的网址: http://www.msxindl.com/tools/rmb/
如果这篇文章对你有帮助,留下三连~~ 感谢!!!
面试题——————JAVA完成人民币大写转化相关推荐
- Java实现人民币大写+GUI界面
项目资源下载链接Java实现人民币大写+GUI界面 文章标题 1.提要 2.算法 3. 代码 (1)界面:windowbuilder插件的使用 (2)实现人民币转换的类 Convert.java (3 ...
- JAVA的人民币大写(金额)转化
在项目开发过程中偶尔会遇到需要把人民币金额由数字转换成大写金额的形式,例如,将"123456"转换成"壹拾贰万叁千肆百伍拾陆"这样子,这种情况在程序需要打印一些 ...
- Java实现人民币大写
创建ConvertMoney类,主方法接受用户输入的金额,然后通过convert()方法把金额转换大写格式的字符串格式,并输出到控制台. public static void main (String ...
- 把大写的人民币金额转化为数字,不考虑角分,只精确到圆(整)
package com.mmq;/*** 请实现函数,把我们日常使用的大写的人民币金额转化为数字* 不考虑角分,只精确到圆(整),注该函数将被执行100万次,请考虑效率* @use * @Projec ...
- java实现人民币数字转换中文大写的工具实例代码demo分享
原文:java实现人民币数字转换中文大写的工具实例代码demo分享 http://www.zuidaima.com/share/1816208858221568.htm 刚好在项目里面用到了数字转化为 ...
- 根据人民币大写规则写的java工具类
需求场景:传入一个数字,把它转成人民币大写. 先看下人民币大写规则: 一.人民币大写金额数字到"元"为止的.在"元"之后.应写"整"(或&q ...
- java把小写变大写_用java实现人民币小写变大写的方法
用java语言可以实现人民币小写转换为大写吗?如何实现呢?下面常见的用java实现人民币小写变大写的方法可以说是最精简的了,希望大家可以学习下. 这里介绍一个通过取余的办法来实现将人民币小写转换为大写 ...
- 人民币大写转阿拉伯数字的java实现
人民币大写转阿拉伯数字的工具类,简单粗暴的替换就完事了 import java.util.HashMap; import java.util.Map;public class ValueConvert ...
- java实现阿拉伯数字转人民币大写(精确到分)
这是一个将阿拉伯数字转人民币大写的工具类, 精确到人民币大写分 package com.client;import java.math.BigDecimal;/*** Class Descriptio ...
- Decimal转人民币大写java实现
java,转人民币大写,工具类 完整工具类如下: package com.example.demo.utils;import java.math.BigDecimal;/*** @author* @v ...
最新文章
- 【原创】POSTGRESQL 分区表初次体验
- vue +element 搭建项目,要求既支持pc端又支持移动端
- 50种优化数据库的方法
- iptables下开放ftp连接端口
- python文件读取写入实践_python文件写入实例分析
- makefile / CMake
- mysql数据库open函数_C#访问Mysql数据库方法,以及库函数
- RAID磁盘阵列配置和调优小结
- 移动安全-iOS(一)
- 什么是Reconciliation?
- iOS黑魔法-Method Swizzling
- 结合公司业务后,对极光推送的进一步思考
- 4.16 期货每日早盘操作建议
- 99乘法表图片java_【Java案例】九九乘法表
- iphone邮件服务器 263,在iphone上怎么设置263邮箱
- 思源笔记局域网内访问【使用教程】
- 【应用推荐】如何选择适合自己的笔记应用?附热门笔记应用上手总结
- 《数据结构》:中缀表达式转后缀表达式 后缀表达式的计算
- wireshark的usb抓包分析 2 - 分析数据
- stm32cube,hal库来实现PS2手柄数据发送