`
zsmud
  • 浏览: 71764 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

JAVA写的中文金额转换程序

 
阅读更多
闲来无事,突然想自己写个中文金额转换程序,想做到简洁高效优雅,看似简单的需求,做起来不一定就容易,特别是对于中间多个零的情况,还有单位换算。
package com.zsmud.ui;

import java.math.BigInteger;
import java.text.DecimalFormat;

/**
 * 最大到九千兆之上
 * @author Zhengsm
 * @date 2012/12/10
 */
public class ToChineseAmount {
	
	private static char[] chineseAmt = {'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'};
	private static char[] units = {'拾','佰','仟'};//i=1,i=2,i=3,i=5,i=6,i=7,i=9,i=10,i=11
	private static char[] chineseUnits = {'元','万','亿','兆'};//i=0,i=4,i=8,
	private static char[] smallUnits = {'分','角'};
	
	public static String formatInt(BigInteger num) {
		if(num.equals(BigInteger.ZERO)) return "零元";
		if(num.toString().length()>16) throw new RuntimeException("too max num");
		StringBuffer result = new StringBuffer("");
		BigInteger radix = new BigInteger("10");
		int i=0;
		char preChar = 0;
		while(num.compareTo(BigInteger.ZERO)==1){			
			StringBuffer tmp = new StringBuffer();
			BigInteger rest = num.mod(radix);
			num = num.divide(radix);
			if(rest.equals(BigInteger.ZERO) && preChar!='零' && inArray(chineseAmt,preChar)){
				tmp.append('零');
			}else if(!rest.equals(BigInteger.ZERO)){
				tmp.append(chineseAmt[rest.intValue()]);
				if(i%4!=0) tmp.append(units[i%4-1]);
			}
			if(i%4==0) {
				if(tmp.length()>0 && tmp.charAt(0)=='零') 
					tmp.insert(0, chineseUnits[i/4]);
				else
					tmp.append(chineseUnits[i/4]);
			}
			preChar = tmp.length()>0? tmp.charAt(0):0;
			i++;
			result.insert(0, tmp);
		}
		
		return result.toString();
	}
	
	public static String formatSmall(int small){
		if(small>100) throw new RuntimeException("too small");
		StringBuffer result = new StringBuffer("");
		char preChar = 0;
		int i=0;
		while(small>0){
			StringBuffer tmp = new StringBuffer();
			int rest = small%10;
			small = small/10;
			if(rest==0 && preChar!='零' && inArray(chineseAmt,preChar)){
				tmp.append('零');
			}else if(rest!=0){
				tmp.append(chineseAmt[rest]);
				tmp.append(smallUnits[i]);
			}
			preChar = tmp.length()>0? tmp.charAt(0):0;
			i++;
			result.insert(0, tmp);
		}
		return result.toString();
	}
	
	private static boolean inArray(char[] array,char c){
		for(char ch : array){
			if(ch == c) return true;
		}
		return false;
	}
	
	public static String format(double num){
		DecimalFormat df = new DecimalFormat("#.00");
		String input = df.format(num);
		StringBuffer sb = new StringBuffer();
		if(input.indexOf('.')!=-1) {
			sb.append(formatInt(new BigInteger(input.substring(0, input.indexOf('.')))));
			sb.append(formatSmall(Integer.parseInt(input.substring(input.indexOf('.')+1))));
		}
		return sb.toString();
	}
	
	public static void main(String[] args){
		System.out.println(formatInt(new BigInteger("909")));
		System.out.println(formatInt(new BigInteger("9009")));
		System.out.println(formatInt(new BigInteger("9099")));
		System.out.println(formatInt(new BigInteger("909099")));
		System.out.println(formatInt(new BigInteger("909909")));
		System.out.println(formatInt(new BigInteger("909999")));
		System.out.println(formatInt(new BigInteger("90909999")));
		System.out.println(formatInt(new BigInteger("900090019001921")));
		System.out.println(formatInt(new BigInteger("900090009000")));
		System.out.println(formatInt(new BigInteger("90909000")));
		System.out.println(formatInt(new BigInteger("90999009")));
		System.out.println(formatInt(new BigInteger("909009009")));
		System.out.println(formatInt(new BigInteger("9009909009009")));
		System.out.println(formatInt(new BigInteger("9009009909009009")));
		System.out.println(formatSmall(78));
		System.out.println(format(9999990999999.99));
		System.out.println(format(9999990999999.00));
	}

}

分享到:
评论

相关推荐

    java写的金额转换器,双击可直接运行

    用Java写的一小程序,已打包成jar包,双击rm2.bat即可运行(当然得有jdk和环境变量设置好)。 完成将数字转换成中文大写金额,数量可以为任何位数,超过亿位,小数只取前两位。

    java 实现 金额转成中文大写形式

    用java代码 实现金额阿拉伯数字 转成 中文汉字大写形式

    java写的把数字转化成英语的工具

    有些变态的报表需要把数字转换成英文输出,但愿这个能帮得到你 one hundred eighty-eight thousand, eight hundred one hundred eighty-eight thousand, eight hundred one one hundred eighty-eight thousand, ...

    ATM自动取款机&金额转换成大写

    该程序用java语言实现,编译环境Myecilpse,模拟自动取款机,用图形用户界面实现!分别实现:存款,取款,显示余额,修改密码,退出登录,退出系统等功能!并且能够吧交易金额转换成大写表示形式

    阿拉伯数字转化汉字

    阿拉伯数字金额转换成汉字金额,比如1000.00 转换成 壹仟元。

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

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

    Java面试宝典-经典

    12.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。 81 三. html&JavaScript&ajax部分 82 1. 判断第二个日期比第一个日期大 82 2. 用table显示n条记录,每3行换一次...

    Java面试宝典2010版

    12.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。 81 三. html&JavaScript&ajax部分 82 1. 判断第二个日期比第一个日期大 82 2. 用table显示n条记录,每3行换一次...

    java面试题

    84.5. 金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。 109 84.6. 内部类的实现方式? 112 84.7. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节...

    java面试题大全(2012版)

    12.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。 81 三. html&JavaScript;&ajax;部分 82 1. 判断第二个日期比第一个日期大 82 2. 用table显示n条记录,每3行换一次...

    最新Java面试宝典pdf版

    12.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。 81 三. html&JavaScript&ajax部分 82 1. 判断第二个日期比第一个日期大 82 2. 用table显示n条记录,每3行换一次...

    java基础题 很全面

    Java基础 6 1. 面向对象的特征有哪些方面 6 2. String是最基本的数据类型吗? 7 3. int 和 Integer 有什么区别 7...15. 金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。 40

    Java面试笔试资料大全

    12.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。 81 三. html&JavaScript&ajax部分 82 1. 判断第二个日期比第一个日期大 82 2. 用table显示n条记录,每3行换一次...

    java面试宝典2012

    12.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。 88 三. html&JavaScript;&ajax;部分 89 1. 判断第二个日期比第一个日期大 89 2. 用table显示n条记录,每3行换一次...

    java面试宝典

    28、char 型变量中能不能存贮一个中文汉字?为什么? 10 29、abstract class 和interface 有什么区别? 10 30、Static Nested Class 和Inner Class 的不同? 11 31、java 中会存在内存泄漏吗,请简单描述。 11 32、...

    JAVA面试宝典2010

    12.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。 81 三. html&JavaScript&ajax部分 82 1. 判断第二个日期比第一个日期大 82 2. 用table显示n条记录,每3行换一次...

    Java面试宝典2012新版

    12.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。 81 三. html&JavaScript;&ajax;部分 82 1. 判断第二个日期比第一个日期大 82 2. 用table显示n条记录,每3行换一次...

Global site tag (gtag.js) - Google Analytics