`
toflyhigh
  • 浏览: 7409 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

自己用java写的一个金额大小写转换的程序

阅读更多
     面试的时候碰到过这个问题,当时只说了一下自己的思路,现在把它写下来.

    
package amountchange;

import java.math.BigDecimal;

import org.omg.CORBA.TRANSIENT;

/**
 * 
 * @author toflyhigh
 * 2008-06
 * 
 */
public class AmountChange2RMB {
	private static String bigLetter[] = { "零", "壹", "贰", "叁", "肆", "伍", "陆",
			"柒", "捌", "玖" };

	private static String unit[] = { "元", "拾", "佰", "仟", "万", "拾", "佰", "仟",
			"亿", "拾", "佰", "仟", "万" };

	private static String unitSmall[] = { "分", "角" };

	/**
	 * 
	 * @param args
	 */
	public static void main(String[] args) {

		String[] testStrs = { "1234567888888.100"/* 大十进制数 */,
				"1001"/* 没有小数,且含相邻的两个零 */, "101005.1"/*零在单位所处的位置*/, "1010"/*零在元位*/ };
		System.out.println(new BigDecimal(testStrs[2]).toString());
		System.out.println(trans(testStrs[2]));
	}

	public static String trans(String str) {
		BigDecimal dec = check2BigDecimal(str);
		if (dec == null)
			return null;

		str = dec.toPlainString();
		String[] sArr = str.split("\\.");
		String intOnly = sArr[0];
		String smallOnly = "";
		if (sArr.length == 2)
			smallOnly = sArr[1];

		if (smallOnly.length() > 2) {
			smallOnly = smallOnly.substring(0, 2);
		}

		return transInt(intOnly) + transSmall(smallOnly);
	}

	public static String transInt(String str) {
		if ("0".equals(str))
			return "";

		StringBuffer newS = new StringBuffer();
		char[] cArr = str.toCharArray();

		for (int i = 0; i < cArr.length; i++) {
			String u = unit[cArr.length - i - 1];
			int position = "元万亿".indexOf(u);

			// 遇到零,特殊处理
			if (cArr[i] == '0') {
				// 如果零在特殊位置上:比如个位,万位,亿位
				if (position >= 0) {
					// 如果零在个位:需要加上单位“元”
					if (position == 0) {
						newS.append(unit[cArr.length - i - 1]);
						continue;
					} else {// 如果零不在个位
						// 零不在个位,且这个位后,紧跟着一个零:只需要加上单位
						if (i < cArr.length - 1 && cArr[i + 1] == '0') {
							newS.append(unit[cArr.length - i - 1]);
							continue;
						} else {// 零不在个位,且这个位后,没有紧跟着一个零:需要加上单位和大写数字(注意次序:单位在前,大写数字在后)
							newS.append(unit[cArr.length - i - 1]);
							newS.append(bigLetter[cArr[i] - 48]);
							continue;
						}
					}
				} else {// 零不在特殊位置上
					// 零不在特殊位置上,且这个位后,紧跟着一个零:忽略这个零
					if (i < cArr.length - 1 && cArr[i + 1] == '0') {
						continue;
					}
					// 零不在特殊位置上,且这个位后,没有紧跟着一个零:需要加上大写数字
					newS.append(bigLetter[cArr[i] - 48]);
					continue;
				}

			}

			// 不是零,常规处理
			newS.append(bigLetter[cArr[i] - 48]);
			newS.append(unit[cArr.length - i - 1]);

		}

		return newS.toString();
	}

	public static String transSmall(String str) {
		//因为最多精确到分,所有str的长度最多位2
		
		if (str == null || "".equals(str))
			return "";

		char[] cArr = str.toCharArray();
		if (str.indexOf("0") == -1) {//不含有零,常规处理
			StringBuffer newS = new StringBuffer();
			for (int i = 0; i < cArr.length; i++) {
				newS.append(bigLetter[cArr[i] - 48]);
				newS.append(unitSmall[cArr.length - i - 1]);
			}
			return newS.toString();
		} else {//含有零,分情况考虑
			if (cArr[0] == '0' && cArr[cArr.length == 2 ? 1 : 0] == '0')//两个都为零
				return "";
			if (cArr[0] == '0' && cArr.length == 2 && cArr[1] != '0')//角位为零,分位不为零
				return bigLetter[0] + bigLetter[cArr[1] - 48] + unitSmall[0];
			if (cArr[0] != '0' && cArr.length == 2 && cArr[1] == '0')//分位为零,角位不为零
				return bigLetter[cArr[0] - 48] + unitSmall[1];
		}

		return "";
	}

	public static BigDecimal check2BigDecimal(String str) {
		try {
			double f = Double.valueOf(str);// 0.0 0.1 -5 ""
			if (f < 0)
				System.out.println("输入数据小于0,请检查!");
			return new BigDecimal(f);
		} catch (NumberFormatException e) {
			e.printStackTrace();
		}

		return null;
	}
}


2
0
分享到:
评论

相关推荐

    人民币大小写转换

    Java中关于金额小写转换为大写的工具类

    java编写的简单的单位换算工具

    java编写的简单的单位换算工具 小应用程序,源代码及可执行程序,网页程序

    java小程序

    质数和 数组求子集 求质数 递归求阶乘 递归求斐波拉契数列 单例 大小写金额转换 打印等腰三角型 2的128次方

    Java面试宝典-经典

    24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段...

    Java面试宝典2010版

    24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段...

    java面试题大全(2012版)

    24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段...

    java面试题

    84.9. 题目1:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连. 117 84.10. 写一个方法,实现字符串的反转,如:输入...

    最新Java面试宝典pdf版

    24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段...

    Java面试笔试资料大全

    24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段...

    java面试宝典

    56、写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔。 14 59、Java 编程,打印昨天的当前时刻。 15 60、java 和javasciprt 的区别。 15 61、什么时候用assert? 16 62、error和exception有什么...

    java面试宝典2012

    24. 写一个用jdbc连接并访问oracle数据的程序代码 121 25、Class.forName的作用?为什么要用? 121 26、大数据量下的分页解决方法。 121 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 122 28、这段...

    Java经典编程源码基础例程300.zip

    Java经典编程源码例程,可以做为你的学习设计参考。 第1章 Java语言概述 1 实例001 输出“Hello World” 2 实例002 输出控制台传递的参数 2 实例003 输出由“*”组成的三角形 3 ...实例082 字符串大小写转换 1

    JAVA面试宝典2010

    24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段...

    Java面试宝典2012版

    24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、...

    Java面试宝典2012新版

    24. 写一个用jdbc连接并访问oracle数据的程序代码 111 25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段...

    java基础题 很全面

    又比如这其中用到了一个自己写的javaBean该如何办? 22 18. 在weblogic中发布ejb需涉及到哪些配置文件 22 19. 如何在weblogic中进行ssl配置与客户端的认证配置或说说j2ee(标准)进行ssl的配置 22 20. 如何查看在...

Global site tag (gtag.js) - Google Analytics