`

告诉你什么是优雅的代码(6)------阿拉伯钱数转换为中文形式

    博客分类:
  • Java
 
阅读更多
http://www.iteye.com/topic/766812里谈到
题目: 将正整数的阿拉伯钱数转换为中文形式,如1011→一千零一十一,输出。

作者做得相当啰嗦,也比较低效,正好有缘遇到优雅代码大师区区在下,于是一段优雅代码得以诞生:


public class MoneyTrans {
	
	private static String[] ChinaDigit = {"零","一","二","三","四","五","六","七","八","九"};
	private static String[] UNIT = {"","","十","百","千"};
	private static String[] BIGUNIT = {"","万","亿","兆"};
	private static long MAX = 10000000000000000L - 1;
	private char[] digit;
	public String trans(long n) throws Exception{
		if(n > MAX){
			throw new Exception("数字过大,最多可处理到千兆位");
		}
		StringBuffer buff = new StringBuffer();
		boolean isPrePartZero = false;
		digit = String.valueOf(n).toCharArray();
		int length = digit.length;		
		int pos = (length - 1)/4;
		int headLength = (length - 1)%4 + 1;	
		//  xxxxxxxxxx -->  xx|xxxx|xxxx
		buff.append(partTrans(0,headLength) + BIGUNIT[pos--]);
		for (int i = headLength;i < length ; i = i + 4) {
			String part = partTrans(i , i + 4);
			if(part.length() == 0){
				isPrePartZero = true;
			}else{
				if(isPrePartZero && !part.startsWith(ChinaDigit[0])){
					buff.append(ChinaDigit[0]);
				}
				buff.append(part +  BIGUNIT[pos]) ;
				isPrePartZero = false;
			}
			pos--;
		}
		return buff.toString();
	}
	
	private  String partTrans(int start, int end) {
		StringBuffer buff = new StringBuffer();
		boolean isPreDigitZero = false;
		for (int i = start; i < end; i++) {
			int cur = digit[i] - '0';
			if(cur != 0 ){
				if(isPreDigitZero){
					buff.append(ChinaDigit[0]);
				}
				buff.append(ChinaDigit[cur] + UNIT[end - i]);
				isPreDigitZero = false;
			}
			else {			
				isPreDigitZero = true;
			}			
		}		
		return buff.toString();		
	}

	public static void main(String[] args) throws Exception {		
		MoneyTrans transtor = new MoneyTrans();    
		String money = transtor.trans(9000000000000000L);
		System.out.println(money);
	}

}




结果:
九千兆

1
2
分享到:
评论
4 楼 wfm0105 2016-02-04  
不支持小数
3 楼 andyadc 2014-04-25  
2 楼 yangguo 2010-09-19  
zhengshuangxi1226 写道
MoneyTrans transtor = new MoneyTrans();
String money = transtor.trans(0000100002);
System.out.println(money);


你还可以写成 -100 , -1000.你有兴趣就去验证一下好了。
1 楼 zhengshuangxi1226 2010-09-19  
MoneyTrans transtor = new MoneyTrans();
String money = transtor.trans(0000100002);
System.out.println(money);

相关推荐

    使用阿拉伯数字转换成汉字的应用程序源码(9KB)...

    使用阿拉伯数字转换成汉字的应用程序源码(9KB)

    大小写金额转换-源码

    {-------------------------------------------------------------------- 货币数字转为为中文大写的组件 Version 1.31 by SNAKEJIAO 2003.4.13简介: 可以转化整数,浮点数,及时间日期型数据 配合别名列表可以进行...

    nArabicWords:一个简单有效的数字转阿拉伯语单词转换器,可根据阿拉伯文语法规则将数字转换为等效的阿拉伯语文本

    数字到阿拉伯语单词翻译表 :keycap_1: 介绍该练习的目的是提供一种通用功能,该功能简单但准确,可以按照阿拉伯文的语法规则/设置将数字(整数)转换为阿拉伯语单词(并带有选项)。 该功能不得与特定主题计数绑定...

    Exp02_07_ZhouYiYang_exp02.07_将阿拉伯数字的金额转换成中国传统的形式_

    将阿拉伯数字的金额转换成中国传统的形式,并且附有对该代码的所有解释说明。

    数字大小写转换程序python

    数字大小写转换是指将数字表示的阿拉伯数字(例如123)转换为相应的中文大写数字(例如一百二十三)或英文单词形式(例如One Hundred Twenty-Three),或者将中文大写数字或英文单词形式转换为阿拉伯数字。

    tafqit:阿拉伯数字Tafqeet转换为Word将数字转换为阿拉伯文字中的等价数字

    数字到阿拉伯语单词翻译表 :keycap_1: 介绍该练习的目的是提供一种通用功能,该功能简单但准确,可以按照阿拉伯文的语法规则/设置将数字(整数)转换为阿拉伯语单词(并带有选项)。 该功能不得与特定主题计数绑定...

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

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

    java代码-软三47号JSP3

    java代码-软三47号JSP3

    VC++6.0核心编程源码.rar

    当一个Windows函数返回一个错误代码时,它常常可以用来了解函数为什么会运行失败。Microsoft公司编译了一个所有可能的错误代码的列表,并且为每个错误代码分配了一个32位的号码。 从系统内部来讲,当一个Windows函数...

    VC++中文大写数字转换

    摘要:VC/C++源码,字符处理,数字大写 ...实现思路是在数据库中保存为阿拉伯数字的形式,然后在显示时根据数字的位置和大小,将阿拉伯数字逐个转换为中文大写的数字。 运行环境:Windows/Visual C/C++

    PDG文件批量转换PDF

    再点击“选择存放转换出来的图象文件的文件夹”下一行右边的那个打开文件夹图标单击后,注意:这里最好选一个新的空白文件夹,为什么要用一个新的文件夹?因为这样会比较方便你管理,要是你突然想把图片和PDG文件...

    Java面试宝典-经典

    12.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)-&gt;(一千零一拾一元整)输出。 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)-&gt;(一千零一拾一元整)输出。 40

    Java面试宝典2010版

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

    最新Java面试宝典pdf版

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

    Java面试笔试资料大全

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

    经典JavaScript正则表达式实战

    将阿拉伯数字替换为中文大写形式... 20 替换文本中的URL为链接... 21 从HTML代码段删除指定标签极其内容... 21 用正则给文本分段... 22 转换源代码中的标签... 22 给属性添加双引号... 23 给table加上tbody. 25 去掉...

    JAVA面试宝典2010

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

    java面试题大全(2012版)

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

Global site tag (gtag.js) - Google Analytics