上午没什么事,记得上次做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什么的还望大家来找找,第一次写技术的,多给点意见啦