最后,统一改进为四个函数, 大家可以直接复制这个版的就行
StrToInt (可能返回值是isNaN)
StrToIntDef
StrToFloat (可能返回值是isNaN)
StrToFloatDef
function StrToInt(myStr) {
//"内置浏览器"中,执行的结果如下:
// 空==>(不是整数,取它的默认值)
// 88ABC==>(不是整数,取它的默认值)
// 0123456==>123456
// 123456==>123456
// 3456.==>3456
// E55==>(不是整数,取它的默认值)
// 65E==>(不是整数,取它的默认值)
// 33E4==>330000
// .44E5==>44000
// 2.5E==>(不是整数,取它的默认值)
// 55.E6==>55000000
// 22.3E2==>2230
// 22.31E2==>2231
// 22.31E+2==>2231
// 22.311E2==>(不是整数,取它的默认值)
// -22.3E2==>-2230
// -22.3E-2==>(不是整数,取它的默认值)
// -22.3E+2==>-2230
var rltBool = false;
var rltInt;
var i1 = 0;
var i2 = 0;
var iMinus = 1;
if (myStr.substr(0, 1) == '-') {
iMinus = -1;
myStr = myStr.substr(1);
}
if(myStr.substr(-1)=='.'){
//如果最后一个是小数点号,就直接删除它
myStr=myStr.substr(0,myStr.length-1);
};
if (myStr.substr(0, 1) == '.') {
//如果第1位就是小数点,我们补个零吧,宽容些吧,例如: ".44E5"我们改为"0.44E5"
myStr = '0' + myStr;
};
//统一转化为大字, 这样, 方便判断科技计数法中的"e"
myStr = myStr.toUpperCase().trim();
if (myStr.indexOf('E+') >= 0) {
//如果是科学计数法,含有: e+ ,则替换为e,
if ((myStr.replace('E+', 'E').length + 1) == myStr.length) {
//只出现一次e+ ====>替换后,长度刚好减1
//这是合格的
myStr = myStr.replace('E+', 'E');
} else {
//不合格的,有多个数字要
myStr = '';
}
};
//如果是: "55.E6"-->我们宽容些吧,帮它改为"55.0E6"
myStr = myStr.replace('.E', '.0E');
if (myStr == '') {
//空客会串,直接返回false
} else {
var sIntSet = '0123456789';
var sErrorCharSet = '';
for (var i in myStr) {
if (sIntSet.indexOf(myStr[i]) < 0) {
sErrorCharSet = sErrorCharSet + myStr[i];
}
}
if (sErrorCharSet == '') {
//全部都是0--9之间的数字
rltBool = true;
rltInt = parseInt(myStr);
rltInt = iMinus * rltInt;
} else {
if (sErrorCharSet == 'E') {
//只有一个字母E,我们认为它是科学计数法,
//则E前面的位置必须是中间部分(不能是第1个或最后一个),
if ((myStr.indexOf('E') == 0) || (myStr.indexOf('E') == (myStr.length - 1))) {
//E在第1位,或者最后一位,则不是科学计数法
rltBool = false;
} else {
rltBool = true;
i1 = parseInt(myStr.substr(0, myStr.indexOf('E')));
i2 = Math.pow(10, parseInt(myStr.substr(myStr.indexOf('E') + 1)));
rltInt = i1 * i2;
rltInt = iMinus * rltInt;
}
} else if (sErrorCharSet == '.E') {
//前面是小数,后面是科学计数法
if ((myStr.indexOf('.') == 0) || (myStr.indexOf('E') == (myStr.length - 1))) {
//小数点在第1位,或者E在最后一位
rltBool = false;
} else if ((myStr.indexOf('E') - myStr.indexOf('.')) == 1) {
//小数点和E紧密相隔,中间无任何数字
rltBool = false;
} else {
//这里,还要判断小数点后面的位数和10的幂数
//比如: 1.2345E2 这个转为科学计数法,就是123.45它只是充其量算是小数,但不能算是整数
if ((myStr.indexOf('E') - myStr.indexOf('.') - 1) <= parseInt(myStr.substr(myStr.indexOf('E') + 1))) {
rltBool = true;
i1 = parseFloat(myStr.substr(0, myStr.indexOf('E')));
i2 = Math.pow(10, parseInt(myStr.substr(myStr.indexOf('E') + 1)));
rltInt = i1 * i2;
rltInt = iMinus * rltInt;
} else {
rltBool = false;
}
}
} else {
rltBool = false;
}
}
}
return rltInt;
};
function StrToFloat(myStr) {
//"内置浏览器"中,执行的结果如下:
// 09:35:38.122 空==>(非法Float, 取默认值)
// 09:35:38.126 88ABC==>(非法Float, 取默认值)
// 09:35:38.128 0123456==>123456
// 09:35:38.129 123456==>123456
// 09:35:38.133 12.3456==>12.3456
// 09:35:38.134 .3456==>0.3456
// 09:35:38.139 3456.==>3456
// 09:35:38.142 E55==>(非法Float, 取默认值)
// 09:35:38.143 65E==>(非法Float, 取默认值)
// 09:35:38.145 33E4==>330000
// 09:35:38.147 .44E5==>44000
// 09:35:38.150 2.5E==>(非法Float, 取默认值)
// 09:35:38.151 55.E6==>55000000
// 09:35:38.156 22.3E2==>2230
// 09:35:38.159 22.31E2==>2231
// 09:35:38.163 22.31E+2==>2231
// 09:35:38.167 22.311E2==>2231.1
// 09:35:38.171 -22.3E2==>-2230
// 09:35:38.176 -22.3E-2==>-0.223
// 09:35:38.179 -22.3E+2==>-2230
var rltBool = false;
var rltFloat;
var i1 = 0;
var i2 = 0;
var iMinus = 1;
if (myStr.substr(0, 1) == '-') {
iMinus = -1;
myStr = myStr.substr(1);
}
if (myStr.substr(0, 1) == '.') {
//如果第1位就是小数点,我们补个零吧,宽容些吧,例如: ".44E5"我们改为"0.44E5"
myStr = '0' + myStr;
}
//统一转化为大字, 这样, 方便判断科技计数法中的"e"
myStr = myStr.toUpperCase().trim();
var IsMinus_Power = 0
if (myStr.indexOf('E+') >= 0) {
//如果是科学计数法,含有: e+ ,则替换为e,
if ((myStr.replace('E+', 'E').length + 1) == myStr.length) {
//只出现一次e+ ====>替换后,长度刚好减1
//这是合格的
myStr = myStr.replace('E+', 'E');
IsMinus_Power = 1;
} else {
//不合格的,有多个数字要
myStr = '';
}
} else if (myStr.indexOf('') >= 0) {
//如果是科学计数法,含有: E- ,则替换为e,
if ((myStr.replace('', 'E').length + 1) == myStr.length) {
//只出现一次E- ====>替换后,长度刚好减1
//这是合格的
myStr = myStr.replace('', 'E');
IsMinus_Power = -1;
} else {
//不合格的,有多个数字要
myStr = '';
};
};
//如果是: "55.E6"-->我们宽容些吧,帮它改为"55.0E6"
myStr = myStr.replace('.E', '.0E');
if (myStr == '') {
//空客会串,直接返回false
} else {
var sIntSet = '0123456789';
var sErrorCharSet = '';
for (var i in myStr) {
if (sIntSet.indexOf(myStr[i]) < 0) {
sErrorCharSet = sErrorCharSet + myStr[i];
}
}
if ((sErrorCharSet == '') || (sErrorCharSet == '.')) {
//全部都是0--9之间的数字
rltBool = true;
rltFloat = parseFloat(myStr);
rltFloat = iMinus * rltFloat;
} else {
if (sErrorCharSet == 'E') {
//只有一个字母E,我们认为它是科学计数法,
//则E前面的位置必须是中间部分(不能是第1个或最后一个),
if ((myStr.indexOf('E') == 0) || (myStr.indexOf('E') == (myStr.length - 1))) {
//E在第1位,或者最后一位,则不是科学计数法
rltBool = false;
} else {
rltBool = true;
i1 = parseFloat(myStr.substr(0, myStr.indexOf('E')));
i2 = Math.pow(10, parseFloat(myStr.substr(myStr.indexOf('E') + 1)));
if (IsMinus_Power == -1) {
i2 = 1 / i2;
};
rltFloat = i1 * i2;
rltFloat = iMinus * rltFloat;
}
} else if (sErrorCharSet == '.E') {
//前面是小数,后面是科学计数法
if ((myStr.indexOf('.') == 0) || (myStr.indexOf('E') == (myStr.length - 1))) {
//小数点在第1位,或者E在最后一位
rltBool = false;
} else if ((myStr.indexOf('E') - myStr.indexOf('.')) == 1) {
//小数点和E紧密相隔,中间无任何数字
rltBool = false;
} else {
rltBool = true;
i1 = parseFloat(myStr.substr(0, myStr.indexOf('E')));
i2 = Math.pow(10, parseFloat(myStr.substr(myStr.indexOf('E') + 1)));
if (IsMinus_Power == -1) {
i2 = 1 / i2;
};
rltFloat = i1 * i2;
rltFloat = iMinus * rltFloat;
}
} else {
rltBool = false;
}
}
}
return rltFloat;
};
function StrToIntDef(myStr, iIntDef) {
var rltInt;
rltInt=StrToInt(myStr);
if (isNaN(rltInt)) {
rltInt = iIntDef;
}
return rltInt;
};
function StrToFloatDef(myStr, iFloatDef) {
var rltFloat;
rltFloat=StrToFloat(myStr);
if (isNaN(rltFloat)) {
rltFloat = iFloatDef;
}
return rltFloat;
};
4 个回复
1***@qq.com (作者)
我自已花了2个多小时, 写了一个手工转化的函数, 分享大家看一下,
欢迎大家指正其中的错误! ( 如有改进, 请告诉我一下)
1***@qq.com (作者)
再次改进一下:
1***@qq.com (作者)
我又整理了一个转化为浮点的函数,
1***@qq.com (作者)
最后,统一改进为四个函数, 大家可以直接复制这个版的就行
StrToInt (可能返回值是isNaN)
StrToIntDef
StrToFloat (可能返回值是isNaN)
StrToFloatDef