金额转换 (java)实现 转载 代码可用 解释超详细
Java金额中文转换

import javax.swing.*;import java.awt.*;import javax.swing.event.CaretEvent;import javax.swing.event.CaretListener;public class MoneyJFrame extends JFrame implements CaretListener {private JTextField jtx_1,jtx_2;private MyJDialog jdialog;public MoneyJFrame(){super("金额的中文大写形式");this.setBounds(400, 300, 450, 100);this.setDefaultCloseOperation(EXIT_ON_CLOSE);this.getContentPane().setLayout(new FlowLayout(FlowLayout.RIGHT));this.getContentPane().add(new JLabel("金额"));jtx_1=new JTextField(30);jtx_1.setHorizontalAlignment(JTextField.RIGHT);this.getContentPane().add(jtx_1);jtx_1.addCaretListener(this);this.getContentPane().add(new JLabel("中文大写形式"));jtx_2=new JTextField(30);jtx_2.setHorizontalAlignment(JTextField.RIGHT);jtx_2.setEditable(false);this.getContentPane().add(jtx_2);jdialog=new MyJDialog(this);this.setVisible(true);}private class MyJDialog extends JDialog{JFrame jframe;JLabel jlabel;MyJDialog(JFrame jframe){super(jframe,"提示",true);this.jframe=jframe;this.setBounds(jframe.getX()+50,jframe.getY()+50 ,400,150);this.setDefaultCloseOperation(HIDE_ON_CLOSE);jlabel=new JLabel("",JLabel.CENTER);this.getContentPane().add(jlabel);}void show(String str){jlabel.setText(str);jdialog.setVisible(true);}}@Overridepublic void caretUpdate(CaretEvent e) {// TODO Auto-generated method stubtry{doublex=Double.parseDouble(jtx_1.getText());jtx_2.setText(zhuanHuan(x));}catch(NumberFormatException nfe){jdialog.show("\""+jtx_1.getText()+"\""+"不能转换成浮点数,请重新输入!");}finally{}}private String zhuanHuan(double x){String number ="零壹贰叁肆伍陆柒捌玖";String money="亿仟佰拾万仟佰拾元角分";int n=(int)Math.round(x*100-0.5);int l=money.length()-1;String result="";while(n>0&&l>0){result=""+number.charAt(n%10)+money.charAt(l)+re sult;n=n/10;l--;}return result;}/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubnew MoneyJFrame();}}。
java转换小写金额为大写金额

java转换⼩写⾦额为⼤写⾦额 找⼯作中,遇到⼀个java⾦额转换的题⽬,在⽹上查找了⼀些资料,看了不是太容易理解,理解能⼒不好。
在此分享在吸取⼤神们处理⽅式的基础上⾃⼰整理的⼀个⼩程序,希望可以帮助到⼤家,也是⾃⼰的⼀个笔记。
代码如下:import java.math.BigDecimal;public class Convert {static String cashUnitLeft[] = { "元", "拾", "佰", "仟", "万", "拾", "佰", "仟","亿", "拾", "佰", "仟", "万" };static String cashUnitRight[] = { "⾓", "分", "厘" };static String upperNumber[] = { "零", "壹", "贰", "弎", "肆", "伍", "陆", "柒","捌", "玖" };public static String convert(BigDecimal money) {String smoney = money.toString();try{if (smoney.indexOf(".") != -1) { //把数值分为整数型和带⼩数的数值分开处理。
String left = smoney.substring(0, smoney.indexOf("."));String right = smoney.substring(smoney.indexOf(".") + 1);String result = convertLeft(left) + convertRight(right);return result;} else {return convertLeft(smoney);}}catch(IllegalArgumentException e){System.out.println(e.getMessage());System.out.println("请输⼊转换范围内现⾦");return null;}}private static String convertLeft(String left) { //处理整数部分。
银行小写金额转成大写金额的java方法

Java将数字金额转换成中文大写形式import java.math.BigDecimal;import java.math.RoundingMode;public class ChineseMoneyUtils {/*** 中文数字*/final static private String[] CHINESE_NUMBER = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };/*** 中文数字单位*/final static private String[] CHINESE_NUMBER_UNIT = { "", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟" };/*** 人民币单位*/final static private String[] CHINESE_MONEY_UNIT = { "圆", "角", "分" };public static void main(String[] args) {String chineseMoney = toChineseMoney(new BigDecimal("320"));System.out.println("chineseMoney = " + chineseMoney);}/*** @param sourceMoney 要转换的数值,最多支持到亿* @return 结果*/public static String toChineseMoney(BigDecimal sourceMoney) {if (new BigDecimal("1000000000000").compareTo(sourceMoney) <= 0&& pareTo(sourceMoney) >= 0) {throw new RuntimeException("支持转换的金额范围为0~1万亿");}StringBuilder sb = new StringBuilder();// 整数部分BigDecimal intPart = sourceMoney.setScale(0, RoundingMode.DOWN);// 小数部分BigDecimal decimalPart = sourceMoney.subtract(intPart).multiply(newBigDecimal(100)).setScale(0,RoundingMode.DOWN);// 处理整数部分圆if (pareTo(BigDecimal.ZERO) > 0) {String intPartNumberString = intPart.toPlainString();int length = intPartNumberString.length();// 统计末尾的零,末尾零不做处理int zeroCount = 0;for (int i = length - 1; i >= 0; i--) {int number = Integer.parseInt(String.valueOf(intPartNumberString.charAt(i)));if (number == 0) {zeroCount++;} else {break;}}for (int i = 0; i < length; i++) {// 如果转换到末尾0,则停止转换if (i + zeroCount == length) {break;}int number = Integer.parseInt(String.valueOf(intPartNumberString.charAt(i)));// 获取中文数字String chineseNumber = CHINESE_NUMBER[number];// 获取中文数字单位String chineseNumberUnit = CHINESE_NUMBER_UNIT[length - i - 1];sb.append(chineseNumber).append(chineseNumberUnit);}// 统计完后加上金额单位sb.append(CHINESE_MONEY_UNIT[0]);} else {sb.append(CHINESE_NUMBER[0]).append(CHINESE_MONEY_UNIT[0]);}// 处理小数部分if (pareTo(new BigDecimal(10)) >= 0) {// 角String jiao = decimalPart.toPlainString();int number = Integer.parseInt(String.valueOf(jiao.charAt(0)));if (number != 0) {String chineseNumber = CHINESE_NUMBER[number];sb.append(chineseNumber).append(CHINESE_MONEY_UNIT[1]);}// 分String fen = decimalPart.toPlainString();number = Integer.parseInt(String.valueOf(fen.charAt(1)));if (number != 0) {String chineseNumber = CHINESE_NUMBER[number];sb.append(chineseNumber).append(CHINESE_MONEY_UNIT[2]);}} else if (pareTo(BigDecimal.ZERO) > 0) {// 分String fen = decimalPart.toPlainString();int number = Integer.parseInt(String.valueOf(fen.charAt(0)));if (number != 0) {String chineseNumber = CHINESE_NUMBER[number];sb.append(chineseNumber).append(CHINESE_MONEY_UNIT[2]);}} else {sb.append("整");}return sb.toString();}}。
java程序:转化金额

java程序:转化⾦额在处理财务账款时,需要将转账⾦额写成⼤写的。
也就是说,如果要转账123456.00元,则需要写成“壹拾贰万叁仟肆佰伍拾陆元整”。
所以常常需要通过程序控制⾃动进⾏转换。
本实例实现了⼩写⾦额到⼤写⾦额的转换。
具体代码如下:import java.text.DecimalFormat;import java.util.*;//@北冥道⼈骑鲲打代码public class f2 {private static String[] numBig = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };private static String[] numInt = { "", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟" };// 整数单位private static String[] numFloat = { "厘", "分", "⾓" };// ⼩数单位public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.println("请输⼊⾦额");double money = input.nextDouble();//格式化double数字DecimalFormat df = new DecimalFormat("#0.###");//此时strNum⼩数位最多3位String strNum = df.format(money);if (strNum.indexOf(".") > 0 ) {//判断是否有⼩数String strMoneyInt = strNum.substring(0, strNum.indexOf("."));if(strMoneyInt.length() > 12){System.out.println("数字太⼤了,转换不了");}else{System.out.println(getInt(strNum) + "元" + getDouble(strNum));}}else{if(strNum.length() > 12){System.out.println("数字太⼤了,转换不了");}else{System.out.println(getInt(strNum) + "元整");}}}//整数部分public static String getInt(String str) {if(str.indexOf(".") != -1){str = str.substring(0,str.indexOf("."));//截取⼩数点前⾯的数字}str = new StringBuffer(str).reverse().toString();//反转字符串StringBuffer strB = new StringBuffer(); //创建⼀个空的StringBuffer对象for (int i = 0; i < str.length(); i++){ //把单位添加进去strB.append(numInt[i]);strB.append(numBig[(str.charAt(i)-48)]);//str.charAt(i)-48,这⾥-48是因为str.charAt(i)-48为ASCII码//⽽参照ASCII码://ASCII码为 48 ==》0//ASCII码为 49 ==》1 ...}str = strB.reverse().toString();//把反转过的字符串还原//替换字符串多于的字符if (str.indexOf("零拾") != -1){str = str.replace( "零拾", "零");}if (str.indexOf("零佰") != -1){str = str.replace( "零拾", "零");}if (str.indexOf("零仟") != -1){str = str.replace( "零拾", "零");}if (str.indexOf("零万") != -1){str = str.replace( "零拾", "万");}if (str.indexOf("零亿") != -1){str = str.replace( "零拾", "亿");}if (str.indexOf("零零") != -1){str = str.replace( "零拾", "零");}if (str.indexOf("亿万") != -1){str = str.replace( "零拾", "亿");}//除去零的结尾if (stIndexOf("零") == str.length() - 1) {str = str.substring(0, str.length() - 1);}return str;}//⼩数部分public static String getDouble(String str) {str = str.substring(str.indexOf(".") + 1);//截取⼩数点后的数字//解决单位错位if(str.length() == 1){str = str +"00";}else if(str.length() == 2){str = str +"0";}str = new StringBuffer(str).reverse().toString();//反转字符串StringBuffer strB = new StringBuffer();//创建⼀个空的StringBuffer对象 for (int i = 0; i < str.length(); i++) {//把单位添加进去strB.append(numFloat[i]);strB.append(numBig[str.charAt(i) - 48]);}str = strB.reverse().toString();//把反转过的字符串还原//替换字符串多于的字符if (str.indexOf("零⾓") != -1){str = str.replace( "零⾓", "零");}if (str.indexOf("零分") != -1){str = str.replace( "零分", "零");}if (str.indexOf("零厘") != -1){str = str.replace( "零厘", "零");}if (str.indexOf("零零") != -1){str = str.replace( "零零", "零");}//除去零的结尾if (stIndexOf("零") == str.length() - 1) {str = str.substring(0, str.length() - 1);}return str;}}运⾏截图:。
教你怎么用Java完成人民币大写转化

教你怎么⽤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"的测试特殊情况的测试(特殊字符、负数、超过⼈民币数值范围)。
[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 代码

}
fraction.insert(0, "元"); // 为整数部分添加标识
} else {
fraction = new StringBuffer("元整");
}
} else {
ms.replace(ms.indexOf("亿万"), ms.indexOf("亿万") + 2, "亿");
}
while (stIndexOf("零") == ms.length() - 1) { // 当结尾为零j,不必显示,经过处理也只可能出现一个零
ms.delete(stIndexOf("零"), stIndexOf("零") + 1);
}
int end;
if ((dotPoint = moneyString.indexOf(".")) != -1) { // 是小数的进入
String fs = moneyString.substring(dotPoint + 1, moneyString
.length());
} else {
moneyStr = moneyString;
}
StringBuffer fraction = null; // 小数部分的处理,以及最后的yuan.
StringBuffer ms = new StringBuffer();
for (int i = 0; i < moneyStr.length(); i++) {
java 财务金额计算代码

java 财务金额计算代码Java程序中的财务金额计算是一项非常重要且广泛使用的功能。
在日常生活中,我们经常需要进行一些金额的计算和处理,例如几个数值的相加、相减、相乘或相除等操作。
这些操作对于财务管理和金融领域的工作者尤为重要,因为准确的金额计算可以帮助他们更好地进行预算、报表和财务决策等工作。
在Java中进行财务金额的计算可以使用Java的内置数据类型BigDecimal。
BigDecimal提供了高精度的十进制数值计算能力,并且避免了浮点数计算过程中的精度丢失问题。
这一点在财务金额计算中非常重要,因为一个微小的误差可能会导致财务数据的严重偏差。
使用BigDecimal进行金额计算非常简单,只需要创建BigDecimal 对象,并且通过调用方法进行各种计算操作。
例如,我们可以使用BigDecimal的add方法进行金额的加法计算,subtract方法进行金额的减法计算,multiply方法进行金额的乘法计算,divide方法进行金额的除法计算。
通过这些方法,我们可以准确计算金额,并且得到正确结果。
除了基本的数学运算,BigDecimal还提供了许多其他的功能来处理财务金额。
例如,我们可以使用setScale方法设置金额的小数位数,使用round方法对金额进行四舍五入,使用compareTo方法比较两个金额的大小,使用max方法取两个金额中的较大值,使用min方法取两个金额中的较小值等等。
这些方法可以帮助我们更好地处理金额数据,并且满足财务计算的需求。
一个常见的财务金额计算是计算利息。
在金融领域中,利息计算是非常重要的一个环节,它涉及到贷款、存款、投资等方面。
在Java 中,我们可以使用BigDecimal来计算利息。
例如,我们可以根据存款金额、利率和存款期限来计算存款的利息。
使用BigDecimal的multiply方法可以计算出存款金额和利率的乘积,再与存款期限相乘,即可得到利息的金额。
这样,我们就可以准确地计算出存款的利息,并且根据实际情况进行合理的财务规划。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
人民币大写转换问题:商业领域,开发票,支票等金钱相关项目通常要求转换成大写,诸如“壹拾圆陆角玖分”.编程过程中,一般的钱币都是double型.当前看到的方法:之所以写这个方法,因为看到的方法设计的不是很好,通常的做法就是逐个字符处理,通过冗长的switch...case结构判断,来决定当前是否应该输出某某汉字,总体来说,完成这件任务是简单的,但是代码和设计质量却不令人满意.设计方法如下:需要注意的问题:1.各个阿拉伯数字可以通过一个数组'壹','贰','叁'....表示.2.对于大于10000和大于100000000的数字,可能出现'万','亿'字样3.对于中间连续为0的数字,正确出现'零'的字样,但是有几种不同的情况需要处理4.对于某个段的数字全零的情况,例如,整个万段都是0的情况-100000101,中间的0如何出现5.角分的处理,如果不存在角分的话,应该出现'圆整'的字样6.整数部分不存在的情况,即只有角分,应该没有'圆'的字样设计框架:1.把数字转化成字符串处理,使用Java的时候,把一个double类型转化成一个字符串类型很简单,调用 String.valueOf(double_var)即可得到,但是有一个问题,当你的数字大于10个位的时候,也就是达亿的时候,他会转换成科学计数法的字串,解决方法就是把他转化成整形long.2.把数字分割成整数部分和小数部分分别处理,根据上面的方法,我们索性把double乘上100,取后两位为小数部分,前面的为整数部分,得到long l = (long)(d*100);String strVal = String.valueOf(l);String head = strVal.substring(0,strVal.length()-2); //整数部分String end = strVal.substring(strVal.length()-2); //小数部分3.我们应该把钱数分成段,每四个一段,实际上得到的是一个二维数组,如下:仟佰拾 ' '' ' $4 $3 $2 $1万$8 $7 $6 $5亿$12 $11 $10 $9其中$i表示这个数字的第i个位置的数字,我们并不实际设定二维数组,我们得到的是数字的位置,要处理的该产生什么样的表示法,很简单这种处理方式往往就是:设pos表示数字位置,pos/4 在那一个段万以下段,万段,亿段.pos%4表示某一个段的段内位置,仟,佰,拾,由于叠加的缘故,即会有千万,百万,千亿等出现,因此这种设计是成立的.这里面隐含了一个问题就是,我们当前的处理的最大数字达千亿位,更大的数字用这种结构是不妥的,因为可能会有万亿,这时候推荐的想法是把这些设计成单维的数组结构,从而取得叠加的表示.4.循环处理各个位的过程中,我们可以预想到,零的问题是最难解决的.因为我们多个连续的零你只能出现一个表示,更有甚者,当某段全为0时,'零'还不能出现.因此这些问题综合考虑得到以下代码.代码:(JAVA描述)public static String changeToBig(double value){char[] hunit={'拾','佰','仟'}; //段内位置表示char[] vunit={'万','亿'}; //段名表示char[] digit={'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'}; //数字表示long midVal = (long)(value*100); //转化成整形String valStr=String.valueOf(midVal); //转化成字符串String head=valStr.substring(0,valStr.length()-2); //取整数部分String rail=valStr.substring(valStr.length()-2); //取小数部分String prefix=""; //整数部分转化的结果String suffix=""; //小数部分转化的结果//处理小数点后面的数if(rail.equals("00")){ //如果小数部分为0suffix="整";} else{suffix=digit[rail.charAt(0)-'0']+"角"+digit[rail.charAt(1)-'0']+"分"; //否则把角分转化出来}//处理小数点前面的数char[] chDig=head.toCharArray(); //把整数部分转化成字符数组char zero='0'; //标志'0'表示出现过0byte zeroSerNum = 0; //连续出现0的次数for(int i=0;i<chDig.length;i++){ //循环处理每个数字int idx=(chDig.length-i-1)%4; //取段内位置int vidx=(chDig.length-i-1)/4; //取段位置if(chDig[i]=='0'){ //如果当前字符是0zeroSerNum++; //连续0次数递增if(zero == '0'){ //标志zero=digit[0];}if(idx==0 &&vidx>0 &&zeroSerNum< 4){prefix += vunit[vidx-1];zero='0';}continue;}zeroSerNum = 0; //连续0次数清零if(zero != '0') { //如果标志不为0,则加上,例如万,亿什么的prefix+=zero;zero='0';}prefix+=digit[chDig[i]-'0']; //转化该数字表示if(idx> 0) prefix += hunit[idx-1];if(idx==0 &&vidx>0){prefix+=vunit[vidx-1]; //段结束位置应该加上段名如万,亿}}if(prefix.length() > 0) prefix += '圆'; //如果整数部分存在,则有圆的字样return prefix+suffix; //返回正确表示}//上面的错误已修改,下面代码对char zero='0';这个标记作了更改,也更好理解:public class NumToRMB{public static void main(String[] args){System.out.println(changeToBig(Double.parseDouble(args[0])));}public static String changeToBig(double value){char[] hunit={'拾','佰','仟'}; //段内位置表示char[] vunit={'万','亿'}; //段名表示char[] digit={'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'}; //数字表示// long midVal = (long)(value*100); ////存在精度问题,如0.9->0.8999...BigDecimalmidVal = new BigDecimal(Math.round(value*100)); //转化成整形,替String valStr=String.valueOf(midVal); //转化成字符串String head=valStr.substring(0,valStr.length()-2); //取整数部分String rail=valStr.substring(valStr.length()-2); //取小数部分String prefix=""; //整数部分转化的结果String suffix=""; //小数部分转化的结果//处理小数点后面的数if(rail.equals("00")){ //如果小数部分为0suffix="整";} else{suffix=digit[rail.charAt(0)-'0']+"角"+digit[rail.charAt(1)-'0']+"分"; //否则把角分转化出来}//处理小数点前面的数char[] chDig=head.toCharArray(); //把整数部分转化成字符数组boolean preZero=false; //标志当前位的上一位是否为有效0位(如万位的0对千位无效)byte zeroSerNum = 0; //连续出现0的次数for(int i=0;i<chDig.length;i++){ //循环处理每个数字int idx=(chDig.length-i-1)%4; //取段内位置int vidx=(chDig.length-i-1)/4; //取段位置if(chDig[i]=='0'){ //如果当前字符是0preZero=true;zeroSerNum++; //连续0次数递增if(idx==0 && vidx >0 &&zeroSerNum < 4){prefix += vunit[vidx-1];preZero=false; //不管上一位是否为0,置为无效0位}}else{zeroSerNum = 0; //连续0次数清零if(preZero) { //上一位为有效0位prefix+=digit[0]; //只有在这地方用到'零'preZero=false;}prefix+=digit[chDig[i]-'0']; //转化该数字表示if(idx > 0) prefix += hunit[idx-1];if(idx==0 && vidx>0){prefix+=vunit[vidx-1]; //段结束位置应该加上段名如万,亿}}}if(prefix.length() > 0) prefix += '圆'; //如果整数部分存在,则有圆return prefix+suffix; //返回正确表示 }}。