将数字转为中文金额的大写方式Java版
java金额数字转换大写算法

java⾦额数字转换⼤写算法根据⼈民币⼤写⾦额规范,转换有⼏点要注意的:阿拉伯数字中间有“0”时,中⽂⼤写⾦额中间可以只写⼀个“零”字。
如¥1,409.50,应写成⼈民币壹仟肆佰零玖圆伍⾓。
阿拉伯数字中间连续有⼏个“0”,中⽂⼤写⾦额中间可以只写⼀个“零”字,如¥6,007.14,应写成⼈民币陆仟零柒圆壹⾓肆分。
阿拉伯⾦额数字万位或元位是“0”,或者数字中间连续有⼏个“0”,万位、元位也是“0”,但仟位、⾓位不是“0”时,中⽂⼤写⾦额中可以只写⼀个零字,也可以不写“零”字,如¥1,680.32,应写成⼈民币壹仟陆佰>捌拾元零三⾓贰分,或者写成⼈民币壹仟陆佰捌拾元三⾓贰分;⼜如¥107,000.53,应写成⼈民币壹拾万柒仟元零伍⾓叁分,或者写成⼈民币壹拾万柒仟圆伍⾓叁分。
阿拉伯⾦额数字⾓位是“0”,⽽分位不是“0”时,中⽂⼤写⾦额“元”后⾯应写“零”字。
如¥16,409.02,应写成⼈民币壹万陆仟肆佰零玖元零贰分;⼜如¥325.04,应写成⼈民币叁佰贰拾圆零肆分。
⼤写⾦额到“元”为⽌的,在“元”之后应写上“整”或“正”字,在“⾓”之后可以不写“整”或“正”字,在“分”之后的不写”整“或”正“字。
基本思路,每4个⼀组,表⽰千、百、拾,然后加上亿、万、圆,这样的,如果有重复的0,需要忽略public class MoneyToChiness{public static void main(String[] args) {long l = System.currentTimeMillis();System.out.println(MoneyToChiness.moneyToChinese(new BigDecimal("999999999999.99")));System.out.println(System.currentTimeMillis()-l);}public static String moneyToChinese(BigDecimal i_money) {if(i_money.equals(BigDecimal.ZERO)){return "零圆整";}Double max = 1000000000000D;Double min = 0.01D;if (i_money.doubleValue() >= max || i_money.doubleValue() < min) {return "⼤于1万亿或⼩于1分了";}i_money = i_money.setScale(2, RoundingMode.HALF_UP);String numStr = i_money.toString();int pointPos = numStr.indexOf('.');//整数部分String s_int = null;//⼩数部分String s_point = null;if (pointPos >= 0) {s_int = numStr.substring(0, pointPos);s_point = numStr.substring(pointPos + 1);} else {s_int = numStr;}StringBuilder sb = new StringBuilder();if(!"0".equals(s_int)){int groupCount = (int) Math.ceil(s_int.length() / 4.0);for (int group = 0; group < groupCount; group++) {boolean zeroFlag = true;boolean noZeroFlag = false;int start = (s_int.length() % 4 == 0 ? 0 : (s_int.length() % 4 - 4)) + 4 * group;for (int i = 0; i < 4; i++) {if (i + start >= 0) {int value = s_int.charAt(i + start) - '0';if (value > 0) {sb.append(CN_UPPER_NUMBER[value]);if (i < 3) {sb.append(CN_UPPER_UNIT[i]);}zeroFlag = true;noZeroFlag = true;} else if (zeroFlag) {sb.append('零');zeroFlag = false;}}}if(sb.charAt(sb.length() - 1) == '零'){sb.deleteCharAt(sb.length() - 1);}if(noZeroFlag || groupCount - group == 1){sb.append(CN_GROUP[groupCount - group - 1]);}}}if (s_point == null || "00".equals(s_point)) {sb.append('整');}else{int j = s_point.charAt(0) - '0';int f = s_point.charAt(1) - '0';if(j > 0){sb.append(CN_UPPER_NUMBER[j]).append('⾓');if(f != 0){sb.append(CN_UPPER_NUMBER[f]).append('分');}}else if("0".equals(s_int)){sb.append(CN_UPPER_NUMBER[f]).append('分');}else {sb.append('零').append(CN_UPPER_NUMBER[f]).append('分');}}return sb.toString();}private static final char[] CN_UPPER_NUMBER = "零壹贰叁肆伍陆柒捌玖".toCharArray();private static final char[] CN_UPPER_UNIT = "仟佰拾".toCharArray();private static final char[] CN_GROUP = "圆万亿".toCharArray();}执⾏三次耗时分别为,6毫秒,5毫秒,6毫秒,平均5.67毫秒。
Java代码实现数字金额转换为中文大写形式

Java代码实现数字⾦额转换为中⽂⼤写形式代码:package com.example.test;import java.util.regex.Matcher;import java.util.regex.Pattern;public class MoneyTest {private static final Pattern AMOUNT_PATTERN = pile("^(0|[1-9]\\d{0,11})\\.(\\d\\d)$");private static final char[] RMB_NUMS = {'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'};private static final String[] UNITS1 = {"元", "⾓", "分", "整"};private static final String[] UNITS2 = {"", "拾", "佰", "仟"};private static final String[] UNITS3 = {"", "万", "亿"};public static void main(String[] args) {System.out.println(numberConvertAmount("100500.32"));}/*** 将⾦额(整数部分等于或少于 12 位,⼩数部分 2 位)转换为中⽂⼤写形式.** @param amount ⾦额数字* @return 中⽂⼤写* @throws IllegalArgumentException*/public static String numberConvertAmount(String amount) throws IllegalArgumentException {// 去掉分隔符amount = amount.replace(",", "");// 验证⾦额正确性if (amount.equals("0.00")) {throw new IllegalArgumentException("⾦额不能为零.");}Matcher matcher = AMOUNT_PATTERN.matcher(amount);if (!matcher.find()) {throw new IllegalArgumentException("输⼊⾦额有误.");}String integer = matcher.group(1); // 整数部分String fraction = matcher.group(2); // ⼩数部分String result = "";if (!integer.equals("0")) {result += integerToRmb(integer) + UNITS1[0]; // 整数部分}if (fraction.equals("00")) {result += UNITS1[3]; // 添加[整]} else if (fraction.startsWith("0") && integer.equals("0")) {result += fractionToRmb(fraction).substring(1); // 去掉分前⾯的[零]} else {result += fractionToRmb(fraction); // ⼩数部分}return result;}// 将⾦额⼩数部分转换为中⽂⼤写private static String fractionToRmb(String fraction) {char jiao = fraction.charAt(0); // ⾓char fen = fraction.charAt(1); // 分return (RMB_NUMS[jiao - '0'] + (jiao > '0' ? UNITS1[1] : ""))+ (fen > '0' ? RMB_NUMS[fen - '0'] + UNITS1[2] : "");}// 将⾦额整数部分转换为中⽂⼤写private static String integerToRmb(String integer) {StringBuilder buffer = new StringBuilder();// 从个位数开始转换int i, j;for (i = integer.length() - 1, j = 0; i >= 0; i--, j++) {char n = integer.charAt(i);if (n == '0') {// 当 n 是 0 且 n 的右边⼀位不是 0 时,插⼊[零]if (i < integer.length() - 1 && integer.charAt(i + 1) != '0') {buffer.append(RMB_NUMS[0]);}// 插⼊[万]或者[亿]if (j % 4 == 0) {if (i > 0 && integer.charAt(i - 1) != '0' || i > 1 && integer.charAt(i - 2) != '0'|| i > 2 && integer.charAt(i - 3) != '0') {buffer.append(UNITS3[j / 4]);}}} else {if (j % 4 == 0) {buffer.append(UNITS3[j / 4]); // 插⼊[万]或者[亿] }buffer.append(UNITS2[j % 4]); // 插⼊[拾]、[佰]或[仟] buffer.append(RMB_NUMS[n - '0']); // 插⼊数字}}return buffer.reverse().toString();}}结果:。
Java阿拉伯数字转换为中文大写数字

Java阿拉伯数字转换为中⽂⼤写数字Java 阿拉伯数字转换为中⽂⼤写数字/*** <html>* <body>* <P> Copyright 1994 JsonInternational</p>* <p> All rights reserved.</p>* <p> Created on 19941115</p>* <p> Created by Jason</p>* </body>* </html>*/package cn.ucaner.alpaca.framework.utils.chinese;import java.text.DecimalFormat;import java.util.HashMap;import java.util.Map;import cn.ucaner.alpaca.framework.utils.string.StringHelper;/*** @Package:cn.ucaner.framework.utils* @ClassName:ChineseNumber* @Description: <p> 阿拉伯数字转换为中⽂⼤写数字. </p>* @Author: - Jason* @CreatTime:2017年8⽉30⽇下午2:15:16* @Modify By:* @ModifyTime:* @Modify marker:* @version V1.0*/public class ChineseNumber {private static final String[] BEFORE_SCALE = { "万", "仟", "佰", "拾", "亿", "仟", "佰", "拾", "万", "仟", "佰", "拾", "" };private static final String[] AFTER_SCALE = { "⾓", "分" };private static final String DEFAULT_PATH_SEPARATOR = ".";private static final Map<String, String> NUMBER_MAPPING = new HashMap<String, String>();static {NUMBER_MAPPING.put("0", "零");NUMBER_MAPPING.put("1", "壹");NUMBER_MAPPING.put("2", "贰");NUMBER_MAPPING.put("3", "叁");NUMBER_MAPPING.put("4", "肆");NUMBER_MAPPING.put("5", "伍");NUMBER_MAPPING.put("6", "陆");NUMBER_MAPPING.put("7", "柒");NUMBER_MAPPING.put("8", "捌");NUMBER_MAPPING.put("9", "玖");}public static String getChineseNumber(String number) {return getChineseNumber(number, null, null);}public static String getChineseNumber(String number, String unit, String postfix) {String[] numbers = StringHelper.strToStrArray(number, DEFAULT_PATH_SEPARATOR);if (numbers.length > 2) {new NumberFormatException("数字格式错误!");}int length = numbers[0].length();int isZero = 0;StringBuffer result = new StringBuffer();for (int i = 0; i < length; i++) {String digit = String.valueOf(numbers[0].charAt(i));boolean allZero = true; // 如果后继的全部是零,则跳出for (int j = i; j < length; j++) {if (numbers[0].charAt(j) != '0') {allZero = false;break;}}if (allZero) {boolean hasValue = false;for (int z = i; z >= 0; z--) {if (numbers[0].charAt(z) != '0' && length - z <= 7 && length - z >= 5) {hasValue = true;break;}}// 加万单位if ( ( length - i > 4 && length <= 8 ) || ( hasValue && length - i > 4 )) {result.append(BEFORE_SCALE[8]);}// 加亿单位if (length - i >= 9) {result.append(BEFORE_SCALE[4]);}break;}if (length < 9 && length - i == 5) {if (!"0".equals(digit) && isZero > 0) {result.append(NUMBER_MAPPING.get("0"));}if ("0".equals(digit)) {result.append(BEFORE_SCALE[8]);if (isZero > 0) {result.append(NUMBER_MAPPING.get("0"));}continue;}}if ("0".equals(digit) && length > 9 && length - i == 9) {result.append(BEFORE_SCALE[4]);continue;}if (isZero < 1 || !"0".equals(digit)) {if ("0".equals(digit)) {if (length - i != 6 && length - i != 7) {result.append(NUMBER_MAPPING.get(digit));}} else {result.append(NUMBER_MAPPING.get(digit));}if (!"0".equals(digit)) {result.append(BEFORE_SCALE[BEFORE_SCALE.length - length + i]);}}if ("0".equals(digit)) {isZero++;} else {isZero = 0;}}result.append(unit == null ? "圆" : result.append(unit));if (numbers.length == 1) {result.append(postfix == null ? "整" : result.append(postfix));return result.toString();}length = numbers[1].length();for (int j = 0; j < length; j++) {if (j > 2) {break;}if (numbers[1].charAt(j) == '0') {continue;}result.append(NUMBER_MAPPING.get(String.valueOf(numbers[1].charAt(j)))); result.append(AFTER_SCALE[j]);}result.append(postfix == null ? "整" : result.append(postfix));return result.toString();}public static String getChineseNumber(int number) {return getChineseNumber(new Integer(number));}public static String getChineseNumber(int number, String unit, String postfix) { return getChineseNumber(new Integer(number), unit, postfix);}public static String getChineseNumber(Long number) {return getChineseNumber(number.toString(), null, null);}public static String getChineseNumber(Integer number) {return getChineseNumber(number.toString(), null, null);}public static String getChineseNumber(Integer number, String unit, String postfix) { return getChineseNumber(number.toString(), unit, postfix);}public static String getChineseNumber(Long number, String unit, String postfix) { return getChineseNumber(number.toString(), unit, postfix);}public static String getChineseNumber(long number) {return getChineseNumber(new Long(number));}public static String getChineseNumber(long number, String unit, String postfix) { return getChineseNumber(new Long(number), unit, postfix);}public static String getChineseNumber(double number, String unit, String postfix) { DecimalFormat f = (DecimalFormat) DecimalFormat.getInstance();f.applyLocalizedPattern("#.##");return getChineseNumber(f.format(number), unit, postfix);}public static String getChineseNumber(double number) {return getChineseNumber(number, null, null);}public static String getChineseNumber(Double number) {return getChineseNumber(number.doubleValue());}public static String getChineseNumber(Double number, String unit, String postfix) { return getChineseNumber(number.doubleValue(), unit, postfix);}public static void main(String[] args) {System.out.println(getChineseNumber(1994));System.out.println(getChineseNumber(1994.1115));System.out.println(getChineseNumber(19941115));}}//Outputs//壹仟玖佰玖拾肆圆整//壹仟玖佰玖拾肆圆壹⾓壹分整//壹仟玖佰玖拾肆万壹仟壹佰壹拾伍圆整。
数字换大写的java应用程序

数字换大写的java应用程序―――有趣之问十1、从键盘输入任意数字,例如:10860,然后输出其相对应的大写,如: 壹万〇捌佰陆拾圆整. 请编写一个JAVA应用程序实现它(提示:参考如下图。
)//////////////////////////////////////////////////import java.util.Scanner;/*** 键盘输入任意数字,例如:10860,然后输出其相对应的大写,如: 壹万〇捌佰陆拾圆整.*/public class ChangeNumberTest {public static void main(String[] args) {String[] shuzi = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };String[] weishu = { "", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿","拾", "佰", "仟" , "兆"};Scanner sc = new Scanner(System.in);System.out.println("本程序是:将一个13位以下的整数金额转换成大写汉字金额表示形式。
\n\n");System.out.print("请输入数据:");String ss = sc.next();//"15012" ===>>> '1' '5' '0' '1' '2'int len = ss.length();String result = "";//n 表示这个整数的长度for ( int i = 0; i < ss.length(); i++) {int x = ss.charAt(i) - '0';int loc = len-i-1;String s1 = shuzi[x];String d1 = weishu[loc];if( x == 0 ){if( loc == 4 || loc == 8 ){result += d1; //当数字为零时且是万位或亿位时。
Java实现数字大写转换

Java实现数字⼤写转换需求如下:⽤json读取后台⼯时信息,⽐如23.5⼩时,需要通过编码将其转换为贰拾叁点伍⽐如23.23之前有对Stringl类型强转为Double在转为整型,发⽣了精度丢失,后来想想对⼩数点进⾏分割是个办法编码实现如下:package day1;import java.util.ArrayList;import java.util.Collections;import java.util.regex.Pattern;public class test_5 {/*** 单位进位,中⽂默认为4位即(万、亿)*/public static int UNIT_STEP = 4;/*** 单位*/public static String[] CN_UNITS = new String[] { "个", "⼗", "百", "千", "万", "⼗","百", "千", "亿", "⼗", "百", "千", "万" };/*** 汉字*/public static String[] CN_CHARS = new String[] { "零", "⼀", "⼆", "三", "四","五", "六", "七", "⼋", "九" };/*** 将阿拉伯数字转换为中⽂数字123=》⼀⼆三** @param srcNum* @return*/public static String getCNNum(int srcNum) {String desCNNum = "";if (srcNum <= 0)desCNNum = "零";else {int singleDigit;while (srcNum > 0) {singleDigit = srcNum % 10;desCNNum = String.valueOf(CN_CHARS[singleDigit]) + desCNNum;srcNum /= 10;}}return desCNNum;}/*** 数值转换为中⽂字符串如2转化为贰*/public String cvt(long num) {return this.cvt(num, false);}/*** 数值转换为中⽂字符串(⼝语化)** @param num* 需要转换的数值* @param isColloquial* 是否⼝语化。
Java工具类(一)财务金额小写数字转换中文大写工具类

Java⼯具类(⼀)财务⾦额⼩写数字转换中⽂⼤写⼯具类代码private static final String UNIT = "万千佰拾亿千佰拾万千佰拾元⾓分";private static final String DIGIT = "零壹贰叁肆伍陆柒捌玖";private static final double MAX_VALUE = 9999999999999.99D;//⾦额⼤写功能转换public static String change(double v) {String head = "";if(v<0){head = "负";v = Math.abs(v);}if (v > MAX_VALUE){return "参数⾮法!";}long l = Math.round(v * 100);if (l == 0){return "零元整";}String strValue = l + "";// i⽤来控制数int i = 0;// j⽤来控制单位int j = UNIT.length() - strValue.length();String rs = "";boolean isZero = false;for (; i < strValue.length(); i++, j++) {char ch = strValue.charAt(i);if (ch == '0') {isZero = true;if (UNIT.charAt(j) == '亿' || UNIT.charAt(j) == '万' || UNIT.charAt(j) == '元') {rs = rs + UNIT.charAt(j);isZero = false;}} else {if (isZero) {rs = rs + "零";isZero = false;}rs = rs + DIGIT.charAt(ch - '0') + UNIT.charAt(j);}}if (!rs.endsWith("分")) {rs = rs + "整";}rs = rs.replaceAll("亿万", "亿");return head+rs;}测试public static void main(String[] args) {System.out.println(digitUppercase(987654320.01));}结果玖亿捌千柒佰陆拾伍万肆千叁佰贰拾元零壹分。
[JAVA]金额小写转大写
![[JAVA]金额小写转大写](https://img.taocdn.com/s3/m/487dc5d426fff705cc170a61.png)
private static String[] bits = new String[] { "", "拾", "佰", "仟", "", "拾",
"佰", "仟", "", "拾", "佰", "仟", "", "拾", "佰", "仟", "" };
private static String[] nums = new String[] { "零", "壹", "贰", "叁", "肆", "伍",
"陆", "柒", "捌", "玖" };
public static String getChineseMoney(Double money) {
String[] moneys = moneyStr.split("\\.");
moneyStr = transChineseMoney1(moneys[0])
+ transChineseMoney2(moneys[1]);
return moneyStr;
}
public static String getChineseMoney(String money) {
// System.out.println("打印单个位数值:" + s);
Java将数字金额转为大写中文金额

Java将数字⾦额转为⼤写中⽂⾦额本⽂实例为⼤家分享了Java如何将数字⾦额转为⼤写中⽂⾦额的具体代码,供⼤家参考,具体内容如下前⾔:输⼊数字⾦额参数,运⾏程序得到其对应的⼤写中⽂⾦额;例如:输⼊— 12.56,输出— 12.56:壹拾贰元伍⾓陆分;重点来了:本⼈亲测有效。
奉上代码:/***@Title: ConvertUpMoney* @Description: 将数字⾦额转为⼤写汉字⾦额* @date: 2019年6⽉18⽇下午10:52:27*/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) {integerStr = "";decimalStr = str.substring(1);}else {integerStr = str;decimalStr = "";}//beyond超出计算能⼒,直接返回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 = isWan5(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;if (length == 1 && integers[0] == 0) {return "";}for(int i=0;i<length;i++) {String key = "";if(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) {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 isWan5(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;}}//Testpublic static void main(String[] args) {String number = "12.56";System.out.println(number+": "+ConvertUpMoney.toChinese(number));number = "1234567890563886.123";System.out.println(number+": "+ConvertUpMoney.toChinese(number));number = "1600";System.out.println(number+": "+ConvertUpMoney.toChinese(number));number = "156,0";System.out.println(number+": "+ConvertUpMoney.toChinese(number));number = "-156,0";System.out.println(number+": "+ConvertUpMoney.toChinese(number));number = "0.12";System.out.println(number+": "+ConvertUpMoney.toChinese(number));number = "0.0";System.out.println(number+": "+ConvertUpMoney.toChinese(number));number = "01.12";System.out.println(number+": "+ConvertUpMoney.toChinese(number));number = "0125";System.out.println(number+": "+ConvertUpMoney.toChinese(number));number = "-0125";System.out.println(number+": "+ConvertUpMoney.toChinese(number));number = "sdw5655";System.out.println(number+": "+ConvertUpMoney.toChinese(number));System.out.println(null+": "+ConvertUpMoney.toChinese(null));}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
将数字转为中文金额的大写方式(Java版)将数字转为中文金额的大写方式(Java版)/*** 程序目的:* 从命令行接收一个数,并将其转化为中文金额的大写方式* 例如123.45 --> 壹佰贰拾叁元肆角伍分* @author LovinChan** 看到网上有很多这样的例子程序,不过觉得很不满意。
有些程序我从命名上就觉得* 实在是不符合规范,程序里面的算法没有让人明白得很清楚的注释,读上去觉得有* 点难度,可读性不强。
而且很多程序还存在不少bug,随便一测就测出来了。
* 所以本人还是决定重新写一下这个程序,并且尽量做到消除不必要的bug。
这个程* 序我没有用什么很精妙的算法,不过用了一些Java类库中的类,像是正则表达式之类* 的东西。
由于本人对算法不怎么在行,在做转换操作的时候用的是很笨的方法。
望各位* 大虾海涵,呵呵。
** 程序的注释我尽量写得详细一点,如果觉得这个程序哪里有问题或者是哪里有改进的* 地方欢迎随时跟我交流。
* 我的msn:egg.chenlw@* QQ:543669516(注上为什么加我就可以了)* 我的blog:/egg_chen* 欢迎交流*/public class Trans2RMB {/*** 测试程序的可行性* @param args*/public static void main(String[] args) {System.out.println("\n--------将数字转换成中文金额的大写形式------------\n"); Trans2RMB t2r = new Trans2RMB();String s = t2r.cleanZero(t2r.splitNum(t2r.roundString(t2r.getNum())));// 如果转换过后是一个空串,则不输出屏幕if(!"".equals(s)) {System.out.println("转换成中文后为:" + s);;}System.out.println("\n---------------------------------------------");}/*** 从命令行接收一个数,在其中调用checkNum() 方法对其进行* 验证,并返回相应的值* @return 如果输入合法,返回输入的这个数*/private String getNum() {String s = null;System.out.println("请输入一个数字(精确到小数点后两位):");// 从命令行输入这个浮点数java.util.Scanner scanner = new java.util.Scanner(System.in);s = scanner.next();// 关闭这个Scannerscanner.close();// 判断用户输入是否合法// 若合法,返回这个值;若非法返回"0"if(this.checkNum(s)) {return s;} else {return "";}}/*** 判断用户输入的数据是否合法,用户只能输入大于零的数字,不能输入其它字符* @param s String* @return 如果用户输入数据合法,返回true,否则返回false*/private boolean checkNum(String s) {// 如果用户输入的数里有非数字字符,则视为非法数据,返回falsetry {float f = Float.valueOf(s);// 如果这个数小于零则视为非法数据,返回falseif(f < 0) {System.out.println("非法数据,请检查!");return false;}else {return true;}} catch (NumberFormatException e) {System.out.println("非法数据,请检查!");return false;}}/*** 把用户输入的数以小数点为界分割开来,并调用numFormat() 方法* 进行相应的中文金额大写形式的转换* 注:传入的这个数应该是经过roundString() 方法进行了四舍五入操作的* @param s String* @return 转换好的中文金额大写形式的字符串*/private String splitNum(String s) {// 如果传入的是空串则继续返回空串if("".equals(s)) {return "";}// 以小数点为界分割这个字符串int index = s.indexOf(".");// 截取并转换这个数的整数部分String intOnly = s.substring(0, index);String part1 = this.numFormat(1, intOnly);// 截取并转换这个数的小数部分String smallOnly = s.substring(index + 1);String part2 = this.numFormat(2, smallOnly);// 把转换好了的整数部分和小数部分重新拼凑一个新的字符串String newS = part1 + part2;return newS;}/*** 对传入的数进行四舍五入操作* @param s String 从命令行输入的那个数* @return 四舍五入后的新值*/private String roundString(String s) {// 如果传入的是空串则继续返回空串if("".equals(s)) {return "";}// 将这个数转换成double 类型,并对其进行四舍五入操作double d = Double.parseDouble(s);// 此操作作用在小数点后两位上d = (d * 100 + 0.5) / 100;// 将d 进行格式化s = new java.text.DecimalFormat("##0.000").format(d);// 以小数点为界分割这个字符串int index = s.indexOf(".");// 这个数的整数部分String intOnly = s.substring(0, index);// 规定数值的最大长度只能到万亿单位,否则返回"0"if(intOnly.length() > 13) {System.out.println("输入数据过大!(整数部分最多13位!)");return "";}// 这个数的小数部分String smallOnly = s.substring(index + 1);// 如果小数部分大于两位,只截取小数点后两位if(smallOnly.length() > 2) {String roundSmall = smallOnly.substring(0, 2);// 把整数部分和新截取的小数部分重新拼凑这个字符串s = intOnly + "." + roundSmall;}return s;}/*** 把传入的数转换为中文金额大写形式* @param flag int 标志位,1 表示转换整数部分,0 表示转换小数部分* @param s String 要转换的字符串* @return 转换好的带单位的中文金额大写形式*/private String numFormat(int flag, String s) {int sLength = s.length();// 货币大写形式String bigLetter[] = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};// 货币单位String unit[] = {"元", "拾", "佰", "仟", "万",// 拾万位到仟万位"拾", "佰", "仟",// 亿位到万亿位"亿", "拾", "佰", "仟", "万"}; String small[] = {"分", "角"};// 用来存放转换后的新字符串String newS = "";// 逐位替换为中文大写形式for(int i = 0; i < sLength; i ++) {if(flag == 1) {// 转换整数部分为中文大写形式(带单位)newS = newS + bigLetter[s.charAt(i) - 48] + unit[sLength - i - 1];} else if(flag == 2) {// 转换小数部分(带单位)newS = newS + bigLetter[s.charAt(i) - 48] + small[sLength - i - 1];}}return newS;}/*** 把已经转换好的中文金额大写形式加以改进,清理这个字* 符串里面多余的零,让这个字符串变得更加可观* 注:传入的这个数应该是经过splitNum() 方法进行处理,这个字* 符串应该已经是用中文金额大写形式表示的* @param s String 已经转换好的字符串* @return 改进后的字符串*/private String cleanZero(String s) {// 如果传入的是空串则继续返回空串if("".equals(s)) {return "";}// 如果用户开始输入了很多0 去掉字符串前面多余的'零',使其看上去更符合习惯while(s.charAt(0) == '零') {// 将字符串中的"零" 和它对应的单位去掉s = s.substring(2);// 如果用户当初输入的时候只输入了0,则只返回一个"零"if(s.length() == 0) {return "零";}}// 字符串中存在多个'零'在一起的时候只读出一个'零',并省略多余的单位/* 由于本人对算法的研究太菜了,只能用4个正则表达式去转换了,各位大虾别介意哈... */String regex1[] = {"零仟", "零佰", "零拾"};String regex2[] = {"零亿", "零万", "零元"};String regex3[] = {"亿", "万", "元"};String regex4[] = {"零角", "零分"};// 第一轮转换把"零仟", 零佰","零拾"等字符串替换成一个"零"for(int i = 0; i < 3; i ++) {s = s.replaceAll(regex1[i], "零");}// 第二轮转换考虑"零亿","零万","零元"等情况// "亿","万","元"这些单位有些情况是不能省的,需要保留下来for(int i = 0; i < 3; i ++) {// 当第一轮转换过后有可能有很多个零叠在一起// 要把很多个重复的零变成一个零s = s.replaceAll("零零零", "零");s = s.replaceAll("零零", "零");s = s.replaceAll(regex2[i], regex3[i]);}// 第三轮转换把"零角","零分"字符串省略for(int i = 0; i < 2; i ++) {s = s.replaceAll(regex4[i], "");}// 当"万"到"亿"之间全部是"零"的时候,忽略"亿万"单位,只保留一个"亿"s = s.replaceAll("亿万", "亿");return s;}}。