将数字转为中文金额的大写方式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]金额小写转大写
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));}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
java数字转中文大写金额方法
标题:Java中的数字转中文大写金额方法目录:(可根据实际内容进行排版)1. 介绍2. 实现思路3. 代码示例4. 应用场景5. 总结1. 介绍在实际开发中,有时候我们需要将数字金额转换为中文大写金额,如将123456转换为“壹拾贰万叁仟肆佰伍拾陆元整”。
本文将介绍如何使用Java来实现数字转中文大写金额的方法。
2. 实现思路实现数字转中文大写金额的方法主要涉及数字的分段处理和中文数字的映射。
对于一个给定的数字,我们首先需要将其进行分段,然后对每个段进行中文数字的映射,最后将各个段拼接起来。
具体实现思路如下:- 将输入的数字按照万、千、百、十、个位进行分段处理。
如123456分成12、345、6三个段。
- 对于每个段,逐个数字进行中文数字的映射。
如123转为“壹佰贰拾叁”。
- 最终将各个段拼接起来,加上相应的“亿”、“万”、“元”等单位,得到最终的中文大写金额。
3. 代码示例下面是一个简单的Java代码示例,用于将数字金额转换为中文大写金额:```public class NumberToChinese {// 中文数字private static final String[] CHINESE_NUMBERS = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};// 中文金额单位private static final String[] CHINESE_UNIT = {"", "拾", "佰", "仟", "万", "亿"};// 中文金额段落private static final String[] CHINESE_SECTION = {"", "万", "亿"};public static String toChineseAmount(double amount) {// 将金额转换为字符串形式String amountStr = String.valueOf(amount);// 分割整数和小数部分String[] parts = amountStr.split("\\.");int integerPart = Integer.parseInt(parts[0]);int decimalPart = Integer.parseInt(parts[1]);// 转换整数部分String integerChinese = toChineseInteger(integerPart); // 转换小数部分String decimalChinese = toChineseDecimal(decimalPart); return integerChinese + "元" + decimalChinese;}private static String toChineseInteger(int number) {StringBuilder sb = new StringBuilder();int section = 0;// 处理每个数字段while (number > 0) {int num = number 10000;if (num != 0) {sb.insert(0, CHINESE_SECTION[section]);StringBuilder sectionStr = new StringBuilder();// 处理每个数字段内的数字for (int i = 0; i < 4; i++) {int digit = num 10;if (digit != 0) {sectionStr.insert(0, CHINESE_NUMBERS[digit] +CHINESE_UNIT[i]);} else {if (sectionStr.length() > 0 sectionStr.charAt(0) != '零') {sectionStr.insert(0, "零");}}num /= 10;}sb.insert(0, sectionStr);} else {if (sb.length() > 0 sb.charAt(0) != '零') {sb.insert(0, "零");}}number /= 10000;section++;}if (sb.length() == 0) {sb.append("零");}return sb.toString();}private static String toChineseDecimal(int number) {StringBuilder sb = new StringBuilder();if (number == 0) {sb.append("整");} else {int digit1 = number / 10;int digit2 = number 10;if (digit1 != 0) {sb.append(CHINESE_NUMBERS[digit1] + "角");}if (digit2 != 0) {sb.append(CHINESE_NUMBERS[digit2] + "分");}}return sb.toString();}}```4. 应用场景数字转中文大写金额的方法通常用于财务软件、发票打印等场景中。
JAVA实现数字大写金额转换代码
例子:实现将阿拉伯数字的金额转换成中文大写金额的形式,例如:¥1011 →壹仟零壹拾壹元整。
大写数字为:零、壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿import java.io.*;import ng.String;public class change{public static void main(String agrs[]){//Money用于存放输入的金额数long Money=0;String Mon[]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};String Mon1[]={"拾","佰","仟","万","拾万","百万","仟万","亿","拾亿","百亿","仟亿"},je[]=new String[30];//je[]数组用于存放数字金额被转换后的数字//n用于测试您是否有金额转换int n=agrs.length;if(n==0)System.out.println("请输入需要转换的金额:");//将输入的金额转化成long型的数据else{Money=Long.parseLong(agrs[]); }//bitt用于存放第几个需转换的金额数字,int bitt=0,j,k=-1,i=0;//转换过程while(Money!=0){bitt=(int)(Money%10L);//计算出每个数字对应的大写值for(j=0;j=0;i--)System.out.print(je[i]); }}}}。
java bigdecimal数字转中文大写方法-概述说明以及解释
java bigdecimal数字转中文大写方法-概述说明以及解释1.引言1.1 概述在日常开发中,我们经常会遇到需要将数字转换为中文大写的场景,例如在金融系统中涉及金额的显示。
而在Java中,我们可以利用BigDecimal类来处理精确的数字计算,并结合自定义方法将数字转换为中文大写形式。
本文将介绍如何利用Java中的BigDecimal类以及自定义方法,实现数字转换为中文大写的功能。
我们将详细解释BigDecimal类的简介,以及如何编写一个方法将数字转换为中文大写形式,通过示例代码演示来帮助读者更好地理解和掌握这一技术。
最后,我们将总结本文的内容,探讨该方法的应用推广以及展望未来在该领域的发展。
通过本文的阅读,读者将能够更深入地了解并掌握将数字转换为中文大写的方法。
1.2文章结构1.2 文章结构本文主要分为引言、正文和结论三个部分。
在引言部分,我们将对Java BigDecimal类进行简要介绍,然后明确本文的目的和文章结构。
接着,我们将在正文部分详细解释如何使用Java BigDecimal类中的方法将数字转换为中文大写形式。
具体包括BigDecimal数字转中文大写的方法和示例代码演示。
在结论部分,我们将对本文的内容进行总结,探讨该方法在实际应用中的推广价值,并展望未来的发展方向。
通过本文的阐述,读者将对Java 中BigDecimal数字转中文大写的方法有一个清晰的认识,从而更好地应用于实际项目中。
1.3 目的本文旨在介绍如何使用Java BigDecimal类将数字转换为中文大写的方法。
通过详细的讲解和示例代码演示,读者能够了解这一转换过程的具体步骤和实现方式。
希望读者能够通过本文掌握如何利用Java编程语言中的BigDecimal类来实现数字转中文大写的功能,从而提升其在数字处理和字符串操作方面的技能。
同时,本文也旨在激发读者对Java编程的兴趣,让他们更加熟练地运用BigDecimal类进行数字处理,为日后的编程工作提供更多可能性和灵感。
Java实现数字转换为人民币大写
Java实现数字转换为人民币大写四种简单方法//输入一个数字,将它按人民币大写输出package com.bluedot;public class Da2 {public static void main(String[] args) {//改变money的值,不超过9位数。
int money = 100100;int length = 0;char a[] = { '零', '一', '二', '三', '四', '五', '六', '七', '八', '九' };char b[] = { '一', '十', '百', '千', '万', '十', '百', '千', '亿', '十' };int[] c = new int[10];System.out.println(money + "元");while (money > 0) {c[length] = money % 10;// System.out.print(" 第" + length + "位:");// System.out.println(c[length]);money /= 10;length++;}// 位数对照 '一', '十', '百', '千', '万', '十', '百', '千', '亿', '十'// n: 0 1 2 3 4 5 6 7 8 9int n = length - 1;// System.out.println(n);int wanwei = 0; // 记录万位数是否都为零。
java bigdecimal类型转中文大写金额方法
java bigdecimal类型转中文大写金额方法《Java BigDecimal类型转中文大写金额方法》在日常开发中,有时候我们需要将BigDecimal类型的金额转换成中文大写的金额,这种需求在金融领域的系统中尤为常见。
本文将介绍一种在Java中实现这一功能的方法。
首先,我们需要编写一个将BigDecimal类型的金额转换成中文大写金额的方法。
下面是一个示例实现:```javaimport java.math.BigDecimal;public class NumberToChinese {private static final String[] CN_NUMERIC = new String[]{"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};private static final String[] CN_UPPER_UNIT = new String[]{"", "拾", "佰", "仟"};/*** 将BigDecimal类型的金额转换成中文大写金额** @param number 待转换的金额* @return 转换后的中文大写金额*/public static String toChinese(BigDecimal number) {StringBuilder sb = new StringBuilder();int unit = 0;int index = 0;boolean isZero = true;for (char c : new StringBuilder(number.toString()).reverse().toString().toCharArray()) {int n = c - '0';if (n > 0) {if (isZero) {isZero = false;}if (index >= CN_UPPER_UNIT.length) {sb.insert(0, cnNumeric[n] + CN_UPPER_UNIT[unit]);} else {sb.insert(0, cnNumeric[n] + (n == 0 ? "" : CN_UPPER_UNIT[unit]));}} else {if (unit % 4 == 0) {if (!isZero) {sb.insert(0, CN_UPPER_UNIT[unit]);}}if (!isZero || index >= CN_UPPER_UNIT.length) {sb.insert(0, CN_NUMERIC[n]);}isZero = true;}unit = n == 0 ? 0 : (unit + 1) % 4;if (unit == 0) {sb.insert(0, getENUnit(index));}index++;}return sb.toString();}private static String getENUnit(int index) {String[] units = new String[]{"", "万", "亿", "兆"};return units[index / 4];}}```以上代码展示了一个简单的将BigDecimal类型的金额转换成中文大写金额的方法。
用java代码将金额转换成中文大写
import java.util.regex.Matcher;import java.util.regex.Pattern;public class getChinestMoney {public static void main(String[] args) {System.out.println("原金额为:154846244.20");System.out.println("转换后的金额为:");System.out.println(ChineseMoney("154846244.20"));}/*** 获得中文大写的金额的整数和小数部分* @param money* @return*/public static String ChineseMoney(String money) {String text = transChineseMoney1(money) + transChineseMoney2(money);//"Pattern.CASE_INSENSITIVE"表示不对大小写进行区分Pattern p = pile("零分",Pattern.CASE_INSENSITIVE);Matcher m = p.matcher(text);text = m.replaceAll("");return text;}/*** 截取金额的整数部分,并将其转换成中文大写格式* @return*/public static String transChineseMoney1(String s){ String ss = s;String tmpnewchar = "";//以“.”将ss分成两段,part[0]为整数部分,part[1]为小数部分 String[] part = ss.split("\\.");if (part[0].length() > 10) {// 超出可转换位数return"";}for (int i = 0; i < part[0].length(); i++) {char perchar = part[0].charAt(i);if (perchar == '0')tmpnewchar = tmpnewchar + "零";if (perchar == '1')tmpnewchar = tmpnewchar + "壹";if (perchar == '2')tmpnewchar = tmpnewchar + "贰";if (perchar == '3')tmpnewchar = tmpnewchar + "叁";if (perchar == '4')tmpnewchar = tmpnewchar + "肆";if (perchar == '5')tmpnewchar = tmpnewchar + "伍";if (perchar == '6')tmpnewchar = tmpnewchar + "陆";if (perchar == '7')tmpnewchar = tmpnewchar + "柒";if (perchar == '8')tmpnewchar = tmpnewchar + "捌";if (perchar == '9')tmpnewchar = tmpnewchar + "玖";int j = part[0].length() - i - 1;if (j == 0)tmpnewchar = tmpnewchar + "圆";if (j == 1 && perchar != 0)tmpnewchar = tmpnewchar + "拾";if (j == 2 && perchar != 0)tmpnewchar = tmpnewchar + "佰";if (j == 3 && perchar != 0)tmpnewchar = tmpnewchar + "仟";if (j == 4 && perchar != 0)tmpnewchar = tmpnewchar + "万";if (j == 5 && perchar != 0)tmpnewchar = tmpnewchar + "拾";if (j == 6 && perchar != 0)tmpnewchar = tmpnewchar + "佰";if (j == 7 && perchar != 0)tmpnewchar = tmpnewchar + "仟";if (j == 8 && perchar != 0)tmpnewchar = tmpnewchar + "亿";if (j == 9 && perchar != 0)tmpnewchar = tmpnewchar + "拾";}return tmpnewchar;}/*** 截取金额的小数部分,并将其转换成中文大写格式* @return*/public static String transChineseMoney2(String s) {String ss = s;String tmpnewchar1 = "";String[] part = ss.split("\\.");if (ss.indexOf(".") != -1) {if (part[1].length() > 2) {// MessageDialog.openInformation(null,"提示","小数点之后只能保留两位,系统将自动截段");part[1] = part[1].substring(0, 2);}for (int i = 0; i < part[1].length(); i++) {char perchar = part[1].charAt(i);// System.out.println(perchar);if (perchar == '0')tmpnewchar1 = tmpnewchar1 + "零";if (perchar == '1')tmpnewchar1 = tmpnewchar1 + "壹";if (perchar == '2')tmpnewchar1 = tmpnewchar1 + "贰";if (perchar == '3')tmpnewchar1 = tmpnewchar1 + "叁";if (perchar == '4')tmpnewchar1 = tmpnewchar1 + "肆";if (perchar == '5')tmpnewchar1 = tmpnewchar1 + "伍";if (perchar == '6')tmpnewchar1 = tmpnewchar1 + "陆";if (perchar == '7')tmpnewchar1 = tmpnewchar1 + "柒";if (perchar == '8')tmpnewchar1 = tmpnewchar1 + "捌";if (perchar == '9')tmpnewchar1 = tmpnewchar1 + "玖";if (i == 0 && perchar != 0)tmpnewchar1 = tmpnewchar1 + "角";if (i == 1 && perchar != 0)tmpnewchar1 = tmpnewchar1 + "分"; }}return tmpnewchar1;}}。
javabigdacamel金额小写转中文大写的方法
javabigdacamel金额小写转中文大写的方法问题:javabigdacamel金额小写转中文大写的方法字数:1500-2000字一、介绍在许多应用程序中,例如财务管理系统,有时需要将金额从数字转换为中文大写形式。
通过将金额转换为中文大写形式,可以提高用户体验,并确保金额显示准确。
本文将介绍一种使用Java编程语言实现金额小写转中文大写的方法。
二、分析在将金额从小写数字转换为中文大写时,我们需要遵循一些规则。
下面是一些基本的规则:1. 以“圆”为单位进行金额的转换,如100.00元可以转为壹佰元。
2. 如果金额存在小数部分,则将其转换为角和分,如13.50元可以转换为壹拾叁元伍角。
3. 金额整数部分的处理规则如下:a. 每个数字都有对应的中文大写表示,如:1 - 壹、2 - 贰、3 - 叁等。
b. 除了金额的整数部分第一个数字之外,其他数字前面都需要加上单位,如:1000可以转换为壹仟。
c. 根据金额的位数,我们还需要确定单位的使用,如:1001可以转换为壹仟零壹元。
d. 当金额位数超过一定范围时,还需要使用更大的单位,比如亿、万等。
基于以上规则,我们可以编写Java代码来实现金额小写转中文大写的功能。
三、实现首先,我们需要创建一个Java类来实现金额小写转中文大写的逻辑。
以下是一个示例类的基本结构:public class AmountConverter {private static final String[] NUMBER_MAPPING = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};TODO: 实现金额转换方法TODO: 实现数字转换方法TODO: 实现单位转换方法}上述代码中,我们定义了一个名为AmountConverter的Java类,并声明了三个空方法,用于实现金额转换、数字转换和单位转换的逻辑。
java实现数字金额转换成汉字大写金额
java实现数字⾦额转换成汉字⼤写⾦额我们经常在做项⽬的财务报表,需要打印发票等情况时需要⽤到⼩写的财务⾦额要转换成汉字的⼤写⾦额,下⾯就是实现该功能的代码import ng.Math;/***通⽤型⾦钱转换类**/public class Money {private String HanDigiStr[] = new String[] { "零", "壹", "贰", "叁", "肆", "伍","陆", "柒", "捌", "玖" };private String HanDiviStr[] = new String[] { "", "拾", "佰", "仟", "万", "拾","佰", "仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰","仟", "万", "拾", "佰", "仟" };/*** @param NumStr 输⼊字符串必须正整数,只允许前导空格(必须右对齐),不宜有前导零* @return*/String PositiveIntegerToHanStr(String NumStr) {String RMBStr = "";boolean lastzero = false;boolean hasvalue = false; // 亿、万进位前有数值标记int len, n;len = NumStr.length();if (len > 15)return "数值过⼤!";for (int i = len - 1; i >= 0; i--) {if (NumStr.charAt(len - i - 1) == ' ')continue;n = NumStr.charAt(len - i - 1) - '0';if (n < 0 || n > 9)return "输⼊含⾮数字字符!";if (n != 0) {if (lastzero)RMBStr += HanDigiStr[0]; // 若⼲零后若跟⾮零值,只显⽰⼀个零// 除了亿万前的零不带到后⾯// if( !( n==1 && (i%4)==1 && (lastzero || i==len-1) ) ) //// 如⼗进位前有零也不发壹⾳⽤此⾏if (!(n == 1 && (i % 4) == 1 && i == len - 1)) // ⼗进位处于第⼀位不发壹⾳RMBStr += HanDigiStr[n];RMBStr += HanDiviStr[i]; // ⾮零值后加进位,个位为空hasvalue = true; // 置万进位前有值标记} else {if ((i % 8) == 0 || ((i % 8) == 4 && hasvalue)) // 亿万之间必须有⾮零值⽅显⽰万RMBStr += HanDiviStr[i]; // “亿”或“万”}if (i % 8 == 0)hasvalue = false; // 万进位前有值标记逢亿复位lastzero = (n == 0) && (i % 4 != 0);}if (RMBStr.length() == 0)return HanDigiStr[0]; // 输⼊空字符或"0",返回"零" return RMBStr;}。
javabigdacamel金额小写转中文大写的方法 -回复
javabigdacamel金额小写转中文大写的方法-回复如何将金额小写转为中文大写的方法。
第一步:了解中文大写数字的规则。
中文大写数字共有十个,分别是:零、壹、贰、叁、肆、伍、陆、柒、捌、玖。
同时还有一些计数单位,如:拾、佰、仟、万、亿等。
了解这些规则是转换金额小写为中文大写的前提。
第二步:将小写金额分割成整数部分和小数部分。
首先,要将小写金额按照整数和小数部分进行分割。
例如,如果需要转换的小写金额是12345.67,那么整数部分是12345,小数部分是67。
第三步:转换整数部分。
将整数部分从低位开始,每四位一组进行转换。
首先将每组的数字转换为中文大写数字,然后根据所在的组位加上计数单位。
例如,对于整数部分的12345,则可以按照如下的分组方式进行转换:12345 = 12仟345首先,将12转换为大写数字:壹拾贰。
然后,在壹拾贰后面加上计数单位:12仟。
最后,将345转换为大写数字:叁佰肆拾伍。
将整数部分转换后拼接在一起,即得到了中文大写的整数部分:壹拾贰仟叁佰肆拾伍。
第四步:转换小数部分。
对于小数部分,同样也是将其每位转换为大写数字,然后加上计数单位。
例如,对于小数部分的67,则可以按照如下的方式进行转换:67 = 六拾柒分首先,将6转换为大写数字:陆。
然后,将7转换为大写数字:柒。
最后,将“拾”和“分”加在数字后面。
最终,得到了中文大写的小数部分:陆拾柒分。
第五步:拼接整数和小数部分。
将转换后的整数部分和小数部分拼接在一起,同时在两者之间加上“圆”的字样,即得到了最终的中文大写金额。
将整数部分的“壹拾贰仟叁佰肆拾伍”和小数部分的“陆拾柒分”拼接在一起,并在两者之间加上“圆”,即得到了最终的中文大写金额:壹拾贰仟叁佰肆拾伍圆陆拾柒分。
通过以上五个步骤,我们可以将金额小写转换为中文大写。
需要注意的是,转换过程中需要严格按照中文大写数字的规则进行操作,同时,转换结果中应该包含正确的计数单位。
希望以上方法能对您有所帮助。
人民币小写金额转大写金额(java版)
人民币小写金额转大写金额(java版)代码说明:1.最大支持百万亿(15位整数,2位小数) ;或仟万亿(16位整数)2. 超过最大支持仟万亿(16位整数),只输出大写数字3. 整数部分越大,则小数部分输出越不精确4. 负数,则忽略负号代码:1.原代码import java.text.DecimalFormat;/**小写转大写* @author lily200825 2011-5-16* <li>最大支持<font color='red'>仟万亿</font>(16位整数,2位小数)</li>*/public class RMB {//输出日志public static volatile boolean isDebug = false;//阶值{仟万亿。
仟,佰,拾,元}public static final String[] unit = { "仟","佰","拾","万","仟","佰","拾","亿","仟","佰","拾","万","仟" ,"佰","拾","元" };// 数字表示public static final char[] digit = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌','玖' };/*** 小写金额转大写金额* <li>最大支持<font color='red'>百万亿</font>(15位整数,2位小数) ;或<font color='red'>仟万亿</font>(16位整数)</li>* <li>超过最大支持<font color='red'>仟万亿</font>(16位整数),只输出大写数字</li> * <li>整数部分越大,则小数部分输出越不精确</li>* <li>负数,则忽略负号</li>* @param amount* @return 大写金额*/public static String number2UpperCase(double _amount){double amount = Math.abs(_amount);StringBuffer result = new StringBuffer();/** -------- 整数部分--------*/StringBuffer result_intStr = new StringBuffer();long num = (long)amount;// 转成大写String intStr = getUpperCase(num);int len = intStr.length();String regex_01 = "(零.)+";String regex_00 = "(零)+";String rep_str = "零";char zero = '零';if(len<=16){// ====== 仟万亿======int index = 0;for(int i=16-len ; i<16; i++){result_intStr.append(intStr.charAt(index++));//加权值result_intStr.append(unit[i]);}//加权后,未合并连续零String temp_intStr = result_intStr.toString();int temp_len = temp_intStr.length();if(isDebug){System.out.println("加权后未处理连续零,["+temp_intStr+"]。
阿拉伯数字转换成中文大写数字的java类
}
return chineseStr;
}
/**
*把一个0~9999之间的整数转换为汉字的字符串,如果是0则返回""
* @param amountPart
boolean lastIsZero = true; //在从低位往高位循环时,记录上一位数字是不是0
String chineseStr = "";
for(int i=0; i<amountStrLength; i++) {
if(temp == 0) //高位已无数据
break;
int digit = temp % 10;
lastIsZero = false;
}
temp = temp / 10;
}
return chineseStr;
}
public static void main(String[] args) {
if(args.length == 0) {
System.out.println("转换演示:");
System.out.println("-------------------------");
阿拉伯数字转换成中文大写数字的java类
public classAtoC{
public static String[] chineseDigits = new String[] { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
- 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;}}。