10
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;
}
4

3 に答える 3

9

toFixed()代わりにを使用parseFloat()して、数値を希望どおりにフォーマットできます。たとえば、次の(1.23e-7).toFixed(9)ようにレンダリングされます0.000000123

これらをsortsのデフォルトの文字列比較で並べ替えることができるようにするには、すべての接頭辞にゼロを付け、小数点のドットが揃うようにすべて同じサイズにするようにしてください。

次のように、padLeftを使用して文字列オブジェクトを拡張できます。

String.prototype.padLeft = function(len, char){
var prefix = '';
var length=this.length;
if(len>length)
 for(var i=0;i < len-length;i++) prefix += char;
return prefix + this;
}

今、あなたは呼び出すことができます((1.23e-7).toFixed(9)).padLeft(15,'0')

于 2010-11-08T20:24:44.720 に答える
7

OPは彼のソリューションを投稿しましたが、テーブルソーターソースコードのパーサーと別の質問でJasonSによって与えられた正規表現に基づいた、私が見つけたかなり単純なソリューションを共有したいと思います.

// 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' 
});

それは、科学表記法で与えられたほとんどすべての値を使用して、私のテーブルで機能します。(パーツ)を自動検出し、is:複数のフィールドを正しくソートします。この質問に出くわす可能性のある他の人に役立つことを願っています。

于 2011-04-04T15:30:03.117 に答える
3

問題は parseFloat ではなく、デフォルトで文字列比較を使用するソートです。数値比較を強制してみてください:

a.sort(function(x, y) { return x - y })
于 2010-11-08T17:19:32.130 に答える