Domanda

parseFloat(1.51e-6);
// returns 0.00000151

parseFloat(1.23e-7);
// returns 1.23e-7
// required 0.000000123

Io sono l'ordinamento colonne della tabella che contengono una vasta gamma di numeri in virgola mobile, alcuni rappresentati in notazione scientifica.

Sto usando il jQuery tablesorter2.0 plugin che utilizza 'parseFloat' per le cellule che iniziano con una cifra. Il problema è che restituisce parseFloat molto piccoli numeri rappresentati come 1.23E-7 come stringa e non si espande questo 0,000,000123 millions. Come risultato tablesorter ordina il contenuto della colonna come testo invece di valori numerici.

**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

C'è un modo efficace di rappresentare numeri molto piccoli notazione scientifica ampliato numeri in virgola mobile?

Soluzione:

tablesorter determina come ordinare una colonna in base al primo dei tablesorters parser automatici per restituire vero per il contenuto di una cella della colonna. Se la cella conteneva 1.23E-7 di quanto default per ordinare il testo perché il parser 'cifre' non interpreta questo come un numero.

Quindi, per risolvere il problema, il seguente codice rappresenta il numero notazione scientifica come una stringa che tablesorter può interpretare / parse come cifra e quindi garantisce un ordinamento numerico sulla colonna. @bitplitter -. Grazie per la punta 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;
}
È stato utile?

Soluzione

Anche se l'OP ha pubblicato la sua soluzione, vorrei condividere una soluzione piuttosto semplice mi sono imbattuto su, che si basa sui parser nel tablesorter codice sorgente e l'espressione regolare data dal Jasons su un'altra domanda .

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

Funziona su mie tabelle con praticamente tutti i valori riportati nella notazione scientifica. Si rileva automaticamente (la parte is:) e correttamente ordina più campi. Speranza che aiuta altri che potrebbero inciampare su questa domanda.

Altri suggerimenti

È possibile utilizzare toFixed() invece di parseFloat() per formattare i numeri nel modo desiderato. Per esempio (1.23e-7).toFixed(9) renderà come 0.000000123

Per essere in grado di risolvere questi con confronto di stringhe sorta di default, assicurarsi di prefisso tutti con zeri e renderli tutti della stessa dimensione in modo che i punti decimali wil si allineano.

È possibile estendere l'oggetto stringa con PadLeft in questo modo:

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

Ora è possibile chiamare ((1.23e-7).toFixed(9)).padLeft(15,'0')

il problema non è parseFloat, ma tipo che utilizzi il confronto stringhe di default. Prova rispettare confronto numerico:

a.sort(function(x, y) { return x - y })
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top