转换中文数字为数字【万亿以下,壹贰叁或一二三的中文,小数皆可】

上午没什么事,记得上次做Excel导入读取中文日期,感觉还是有必要的,就想着做个能导入所有中文数字的js也不错,就有了如下代码

var numArray = [
		0,1,2,3,4,5,6,7,8,9,10,100,1000,10000,100000000
	];
	var numChArray = [
		"零","一","二","三","四","五","六","七","八","九","十","百","千","万","亿","点","负","正"
	];
	var numZhArray = [
		"零","壹","贰","叁","肆","伍","陆","柒","捌","玖","拾","佰","仟","万","亿","点","负","正"
	];
	var error = [
		"存在不是中文数字描述的非法字符","输入字符解析失败"
	];
	
	/**
	*中文数字转阿拉伯数字【万亿以下】	参数1-要转化的字符串 参数2-小数点精度位数
	*/
	function parseNumber(s,fix){
		//返回结果
		var result = 0,rtn = "";
		//原数组,原字符串与解析数组,是否加上负号
		var array = [],s = s.replace(' ',''),plan = [],flags = [],minus = false;		
		
		//非法字符Check
		for(var i=0;i<s.length;i++){
			var j=0;
			for(;j<numChArray.length;j++)	if(s.slice(i,i+1) == numChArray[j] || s.slice(i,i+1) == numZhArray[j])	break;
			if(j==numChArray.length){
				alert(i+s.slice(i,i+1)+error[0]);	return 0;
			}
		}	
		
		//正负处理
		if(s.indexOf(numChArray[16]) == 0 || s.indexOf(numChArray[17]) == 0){
			if(s.indexOf(numChArray[16]) == 0)	minus = true;
			s = s.substring(1,s.length);
		}
		//点处理
		if(s.split(numChArray[15]).length>1)
		{			
			var arr = s.split(numChArray[15]);
			var num = [],point = [],floats = '0.';
			for(var i=0;i<arr[1].length;i++)
			{
				for(n in numArray)	
				if(arr[1].slice(i,i+1) == numChArray[n] || arr[1].slice(i,i+1) == numZhArray[n])
				{
					floats += ''+numArray[n];
					break;
				}
			}
			for(var i=0;i<arr[0].length;i++)	array.push(arr[0].slice(i,i+1));
			
			result = parseFloat(floats);
		} else {
			for(var i=0;i<s.length;i++)	array.push(s.slice(i,i+1));
		}
		//整数位解析
		for(num in array)
		{
			var value = array[num],number,flag;
			for(n in numArray)	if(array[num] == numChArray[n] || array[num] == numZhArray[n])	number = numArray[n];
			if(number<10) flag = false;
			else flag = true;
			plan.push({
				number:number,flag:flag
			});
			flags.push(flag);
		}
		//整数位读取计算
		for(var num=0;num<plan.length;num++)
		{
			var data = plan[num],count = 1,member = [];
			if(data.flag){
				var unit = 1;
				//往前推算
				for(var i=num;i>=0;i--)
				{
					member.push(plan[i].number);
					if(!plan[i].flag)	break;
				}
				//向后推算单位【在万和亿前面的数值要将单位算进去】
				for(var j=num+1;j<plan.length;j++){
					if(plan[j].number > 9999 && plan[j].number > data.number && plan[j].number > unit){
						unit = plan[j].number;
						if(j==num+1){
							num = j;
						}
					}
				}
				member.push(unit);
				//结算
				for(n in member)	count = count*member[n];
			}
			else {
				if(num == plan.length-1)	count = data.number;//最后一位为个数直接加上去
				else count = 0;
			}
			result += count;
		}
		//负号控制|转换精度
		if(minus)	result = 0 - result;
		if(String(typeof fix) == 'number')	result = result.toFixed(fix);
		
		if(typeof parseFloat(result) == 'NaN'|| typeof parseFloat(result) =='undefined')){
			alert(error[1]);	return 0;
		}
		return result;
	}
   解释都写着注释里面了,BUG什么的还望大家来找找,第一次写技术的,多给点意见啦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值