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.
В результате таблица сортировщика сортирует содержимое столбца в виде текста вместо чисел.
**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 определяет, как сортировать столбец на основе первого автоматического анализатора таблиц, чтобы возвращать 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;
}