parseFloat(1.51e-6);
// returns 0.00000151
parseFloat(1.23e-7);
// returns 1.23e-7
// required 0.000000123
さまざまな浮動小数点数を含むテーブル列を並べ替えています。一部は科学的記数法で表されています。
数字で始まるセルに「parseFloat」を使用しているjQuerytablesorter2.0プラグインを使用しています。問題は、parseFloatが1.23e-7として表される非常に小さな数値を文字列として返し、これを0.000000123に拡張しないことです。その結果、tablesorterは、列の内容を数値ではなくテキストとしてソートします。
**Column To Sort** 2.34 1.01 13.56 1.23e-7 **After Sort Now** 1.01 1.23e-7 13.56 2.34 **Expect** 1.23e-7 1.01 2.34 13.56
非常に小さい科学的記数法の数を拡張浮動小数点数として表す効率的な方法はありますか?
解決:
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;
}