Pregunta

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

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

Estoy ordenando columnas de las tablas que contienen una amplia gama de números de punto flotante, algunos representados en notación científica.

Estoy utilizando el plugin de jQuery tablesorter2.0 que está utilizando 'parseFloat' para las células que comienzan con un dígito. La cuestión es que devuelve un número muy pequeño parseFloat representados como 1.23e-7 como una cadena y no se está expandiendo a este 0,000000123. Como resultado tablesorter ordena el contenido de la columna como texto en lugar de los valores numéricos.

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

¿Hay una manera eficaz de representar un número muy pequeño de notación científica como ampliado números de punto flotante?

Solución:

tablesorter determina cómo ordenar una columna basada en el primero de los analizadores automáticos tablesorters para devolver cierto para el contenido de una celda de esa columna. Si la celda contenía 1.23e-7 de lo que para ordenar por defecto de texto porque el analizador 'dígito' no interpreta esto como un número.

Así que para solucionar este problema, el siguiente código representa el número notación científica como una cadena que puede interpretar tablesorter / análisis sintáctico como un dígito y así se asegura la clasificación numérica en la columna. @bitplitter -. gracias por 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;
}
¿Fue útil?

Solución

A pesar de que el PO ha publicado su solución, me gustaría compartir una solución bastante simple me topé, que se basa en los programas de análisis de la tablesorter código fuente y la expresión regular dada por jasons en otra pregunta .

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

Funciona en mis tablas con casi todos los valores dados en notación científica. Autodetectados (la parte is:) y ordena correctamente múltiples campos. Espero que ayuda a otras personas que podrían tropezar con esta pregunta.

Otros consejos

Se puede utilizar en lugar de toFixed() parseFloat() para dar formato a los números de la forma que desee. Por ejemplo (1.23e-7).toFixed(9) rendirá como 0.000000123

Para poder clasificar estos con la comparación de cadenas tipo predeterminado, asegúrese de que prefijar todas ellas con ceros y hacerlos todos del mismo tamaño por lo que los puntos decimales Wil se alinean.

Puede extender el objeto de cadena con PadLeft como esto:

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

Ahora se puede llamar ((1.23e-7).toFixed(9)).padLeft(15,'0')

el problema no es parseFloat, pero algo que la comparación usos cadena por defecto. Trate de hacer cumplir comparación numérica:

a.sort(function(x, y) { return x - y })
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top