parseFloat(1.51e-6);
// returns 0.00000151
parseFloat(1.23e-7);
// returns 1.23e-7
// required 0.000000123
我正在对包含多种浮点数的表列进行排序,其中有些用科学计数法表示。
我正在使用jQuery tablesorter2.0插件,该插件对以数字开头的单元格使用“parseFloat”。
问题在于parseFloat返回的非常小的数字表示为字符串,形式为1.23e-7,并且不会将其扩展为0.000000123。
结果,表排序器将列的内容排序为文本而不是数字。
有没有一种有效的方式将非常小的科学计数法表示为扩展的浮点数?
解决方案:
tablesorter确定如何基于第一个tablesorters自动解析器对列进行排序,以对该列中单元格的内容返回true。
如果该单元格包含1.23e-7,则默认不按文本排序,因为“数字”解析器不会将其解释为数字。
因此,要解决此问题,以下代码将科学计数法表示为字符串,表排序程序可以将其解释/解析为数字,从而确保对列进行数字排序。 @bitplitter-感谢toFixed()技巧。
var s = "1.23e-7";
// Handle exponential numbers.
if (s.match(/^[-+]?[1-9]\.[0-9]+e[-]?[1-9][0-9]*$/)) {
s = (+s).toFixed(getPrecision(s));
}
//returns 0.000000123
// Get a nice decimal place precision for the scientific notation number.
// e.g. 1.23e-7 yields 7+2 places after the decimal point
// e.g. 4.5678e-11 yields 11+4 places after the decimal point
function getPrecision(scinum) {
var arr = new Array();
// Get the exponent after 'e', make it absolute.
arr = scinum.split('e');
var exponent = Math.abs(arr[1]);
// Add to it the number of digits between the '.' and the 'e'
// to give our required precision.
var precision = new Number(exponent);
arr = arr[0].split('.');
precision += arr[1].length;
return precision;
}
最佳答案
即使OP发布了他的解决方案,我还是想分享一个偶然发现的更简单的解决方案,该解决方案基于表排序器source code中的解析器和JasonS在another question上给出的正则表达式。
// add parser through the tablesorter addParser method
$.tablesorter.addParser({
// set a unique id
id: 'scinot',
is: function(s) {
return /[+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?/.test(s);
},
format: function(s) {
return $.tablesorter.formatFloat(s);
},
type: 'numeric'
});
它几乎可以用科学计数法给出的所有值在我的 table 上工作。它会自动检测(is:
部分)并正确地对多个字段进行排序。希望它对可能偶然发现此问题的其他人有所帮助。
关于Javascript parseFloat '1.23e-7'在需要0.000000123时给出1.23e-7,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4126206/