`
蒙太奇
  • 浏览: 52197 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

原创as3版数字转换为中文大写单位算法

    博客分类:
  • as3
阅读更多
原创文章,转载请注明出处:http://montage.iteye.com/blog/502784
最大支持行千兆
大至思想都写在注释里面了,欢迎大家测试,有bug提交哦~
package com.ubi.utils
{	
	/**
	 * 主要功能把阿拉伯数字单位转换成中文大写
	 * @author marcoLee
	 */	
	public class MoneyUtils
	{
		//1:个,2:十,3:百,4:千,5:万,6:十万,7:百万,8:千万,9:亿,10:十亿,11:百亿,12:千亿,13:兆, 14:十兆, 15:百兆, 16:千兆
		public static const NUM_CN:Array = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "镹"];
		public static const DECIMAL_UNITS:Array = ["角", "分"];
		public static const LEVELS:Array = ["元", "万", "亿", "兆"];
		public static const UNITS:Array = ["千", "百", "拾"];
		
		public function MoneyUtils()
		{
		}
		
		/**
		 * 把阿拉伯数字单位转换成中文大写
		 * @param num 阿拉伯数字
		 * @return 中文大写
		 */		
		public static function toCNUpper( num:Number ):String
		{
			if( num == 0 )
				return NUM_CN[0];
				
			var count:int = getUnitCount( num );
			var numStr:String = num.toFixed(2);
			var pos:int = numStr.indexOf(".");
			var dotLeft:String = pos == -1 ? numStr : numStr.substring(0, pos);
			var dotRight:String = pos == -1 ? "" : numStr.substring(pos + 1, numStr.length);
			if( dotLeft.length > 16 )
				throw new Error("数字太大,无法处理!");
				
			var cnMoney:String = convertIntegerStr(dotLeft) + convertDecimalStr(dotRight);
			return cnMoney;
		}
		
		/**
		 * 把数字中的整数部分进行转换
		 * @param str
		 * @return 
		 */		
		public static function convertIntegerStr( str:String ):String
		{
			var tCount:int = Math.floor( str.length / 4 );
			var rCount:int = str.length % 4;
			var nodes:Array = [];
			if( rCount > 0 )
				nodes.push( convertThousand(str.substr(0, rCount), tCount ));
				
			for( var i:int = 0; i < tCount; i++ )
			{
				var startIndex:int = rCount + i*4;
				var num:String = str.substring( startIndex, startIndex + 4 );
				nodes.push( convertThousand(num, tCount - i - 1) );
			}
			return convertNodes( nodes );
		}
		
		private static function convertNodes( nodes:Array ):String
		{
			var str:String = "";
			var beforeZero:Boolean;
			for( var i:int = 0; i < nodes.length; i++)
			{
				var node:ThousandNode = nodes[i] as ThousandNode;
				if( ( beforeZero && node.desc.length > 0 ) ||
					( node.beforeZero && node.desc.length > 0 && str.length > 0))
					str += NUM_CN[0];
					
				str += node.desc;
				if( node.afterZero && i < nodes.length - 1 )
					beforeZero = true;
				else if( node.desc.length > 0 )
					beforeZero = false;
			}
			
			return str;
		}
		
		/**
		 * 对四位数进行处理,不够自动补起
		 * @param num
		 * @param level
		 * @return 
		 */		
		private static function convertThousand( num:String, level:int):ThousandNode
		{
			var node:ThousandNode = new ThousandNode();
			var len:int = num.length;
			
			for( var i:int = 0; i < 4 - len; i++ )
				num = "0" + num;
				
			var n1:int = int( num.charAt(0) );
			var n2:int = int( num.charAt(1) );
			var n3:int = int( num.charAt(2) );
			var n4:int = int( num.charAt(3) );
			
			if( n1 + n2 + n3 + n4 == 0 )
				return node;
			
			if( n1 == 0 )
				node.beforeZero = true;
			else
				node.desc += NUM_CN[n1] + UNITS[0];
			
			if( n2 == 0 && node.desc != "" && n3 + n4 > 0)
				node.desc += NUM_CN[0];
			else if( n2 > 0 )
				node.desc += NUM_CN[n2] + UNITS[1];
				
			if( n3 == 0 && node.desc != "" && n4 > 0)
				node.desc += NUM_CN[0];
			else if( n3 > 0 )
				node.desc += NUM_CN[n3] + UNITS[2];
			
			if( n4 == 0 )
				node.afterZero = true;
			else if( n4 > 0 )
				node.desc += NUM_CN[n4];
				
			if( node.desc.length > 0 )
				node.desc  += LEVELS[level];
			return node;
		}
		
		/**
		 * 把数字中的小数部分进行转换
		 * @param str
		 * @return 
		 */		
		public static function convertDecimalStr( str:String ):String
		{
			var newStr:String = "";
			for( var i:int = 0; i < str.length; i++ )
			{
				var n:int = int(str.charAt(i));
				if( n > 0 )
					newStr += NUM_CN[n] + DECIMAL_UNITS[i];
			}
			return newStr;
		}
		
		/**
		 * 用数据方法得到数字整数部分长度
		 * @param num
		 * @return 
		 */		
		public static function getUnitCount( num:Number ):int
		{
			return Math.ceil( Math.log( num ) / Math.LN10 );
		}
		
	}
}

class ThousandNode
{
	public function ThousandNode()
	{
		
	}
	
	public var beforeZero:Boolean;
	public var afterZero:Boolean;
	public var desc:String = "";
}
  • 大小: 12 KB
0
0
分享到:
评论
1 楼 dty025 2014-03-07  
每4位的中间有两个0的时候不准确,如6002会变成“陆仟零零贰元”,类似的还有60026002

相关推荐

    vb 数字转换为英文字母

    在VB(Visual Basic)编程语言中,将数字转换为英文表达是一种常见的需求,尤其是在处理财务报表、发票或者需要用户友好的数字表示时。这个算法主要涉及到数字与英文单词的映射,以及处理不同数量级(个位、十位、...

    如何实现金额大写转换Visual Basic6.0源程序,VB6.0源代码

    - **金额大写转换**:将阿拉伯数字(如123456.78)转换为中文大写(如壹拾贰万叁仟肆佰伍拾陆元柒角捌分)的过程,常见于财务系统中。 2. **实现步骤** - **创建工程**:首先,在VB6.0环境中创建一个新的标准EXE...

    将随意给出的字符串中所有小写字母转换为大写字母

    将随意给出的字符串中所有小写字母转换为大写字母。 【输入】 输入的文件为一个字符串,字符串的长度小于3000。 【输出】 全部为大写字母的字符串。 程序运行后结果示例: 【样例输入】 Founded in 1940, Chongqing ...

    简单的VB数制转换

    通过不断取余和除法,我们可以得到目标基数下的各位数字,然后根据ASCII码表将大于9的数字转换为大写字母。最后,结果字符串需要反向输出,因为我们在计算过程中是从低位到高位的。 在实际应用中,数制转换可能与...

    SQL脚本函数 36进制转换为10进制

    根据给定的信息,本文将详细解释“SQL脚本函数 36进制转换为10进制”的实现原理与具体步骤。此SQL脚本函数的主要功能是将36进制数值转换为十进制数值。 ### 一、理解36进制 在计算机科学中,我们通常使用的是十...

    05年秋江苏计算机二级VB上机试题及答案.doc

    `Text1.Text`代表文本框的文本内容,`Mid`函数用于从字符串中提取子串,`Trim`用于去除字符串两端的空白字符,`UCase`将字符串转换为大写。 9. 结束程序运行: 使用`End`语句可以直接结束程序的执行,如在`...

    SQL脚本函数 16进制转换为10进制

    尤其是在处理网络协议、加密算法或是数据存储格式时,十六进制与十进制之间的转换显得尤为重要。SQL作为关系型数据库的标准查询语言,提供了丰富的功能来支持这类操作。 #### SQL脚本函数详解 该脚本定义了一个名为...

    VB.NET 拼音码

    3. **大小写转换**:一旦我们有了汉字的拼音,就可以根据需求将其转换为大写或小写。VB.NET提供了`ToUpper`和`ToLower`函数,分别用于将字符串转换为大写和小写。 以下是一个简单的示例代码,展示了如何在VB.NET中...

    C#开发实战1200例+第1卷(1).part01

    《C#开发实战1200例》包括第I卷、第II卷共计1200个例子,...42 第3章 字符串处理技术 44 3.1 字符及字符串转换 45 实例035 将字母全部转换为大写或小写 45 实例036 字母与ASCII码的转换 46 实例037 汉字与区位码的转换

    C#开发实战1200例+第1卷(1).part05

    简介:《C#开发实战1200例》包括第I卷、第II卷共计1200个...42 第3章 字符串处理技术 44 3.1 字符及字符串转换 45 实例035 将字母全部转换为大写或小写 45 实例036 字母与ASCII码的转换 46 实例037 汉字与区位码的转换

    C#开发实战1200例+第1卷(1).part03

    简介:《C#开发实战1200例》包括第I卷、第II卷共计1200个...42 第3章 字符串处理技术 44 3.1 字符及字符串转换 45 实例035 将字母全部转换为大写或小写 45 实例036 字母与ASCII码的转换 46 实例037 汉字与区位码的转换

    C#开发实战1200例+第1卷(1).part04

    简介:《C#开发实战1200例》包括第I卷、第II卷共计1200个...42 第3章 字符串处理技术 44 3.1 字符及字符串转换 45 实例035 将字母全部转换为大写或小写 45 实例036 字母与ASCII码的转换 46 实例037 汉字与区位码的转换

    Function_GetPinyin.rar_GetPiny_getpinyin_getpinyin函数_php GetPiny

    在描述中提到的"汉字转全拼,简拼",全拼指的是每个汉字完整的拼音,如“中国”转换为“zhongguo”,而简拼则是汉字首字母组成的字符串,如“中国”转换为“zg”。简拼在某些情况下可以减少数据存储空间,提高查询...

    C#开发实战1200例+第1卷(1).part02

    C#开发实战1200例》包括第I卷、第II卷共计1200个例子,...42 第3章 字符串处理技术 44 3.1 字符及字符串转换 45 实例035 将字母全部转换为大写或小写 45 实例036 字母与ASCII码的转换 46 实例037 汉字与区位码的转换

    精彩编程与编程技巧-输入时,自动转换成小写?...

    因此,想要实现在输入时将大写字母自动转换为小写字母的功能,可以通过简单的算法实现:即在用户按下某个大写字母键时,程序检测该键的ASCII值是否位于65到90之间,如果是,则将该ASCII值加上32(即小写字母与大写...

    基于小型数据库的PDF417编码及软件实现.doc

    如果遇到字符模式的转换(如大写转小写或小写转大写),还需要加上相应的转移码字(如II或as,值为27)。 为了提高程序执行效率,论文提出将数据库与数组结合使用。数据库可以用于存储大量的码字信息,而数组则用于...

    Python 面试100讲(基于Python3.x).zip

    但是,你可以通过内置函数如`lower()`将字符串转换为全小写,`upper()`转为全大写,或者`title()`使每个单词首字母大写。此外,`str.capitalize()`方法用于将字符串的第一个字符转换为大写,而其余字符保持小写。 ...

Global site tag (gtag.js) - Google Analytics