Проверка десятичных чисел в JavaScript - IsNumeric ()

Условия цепочек создают длинные строки, которые не рекомендуется pep8. Использование метода .query вынуждает использовать строки, которые являются мощными, но непитоническими и не очень динамичными.

Как только каждый из фильтров находится на месте, один из подходов -

import numpy as np
import functools
def conjunction(*conditions):
    return functools.reduce(np.logical_and, conditions)

c_1 = data.col1 == True
c_2 = data.col2 < 64
c_3 = data.col3 != 4

data_filtered = data[conjunction(c1,c2,c3)]

np.logical работает и работает быстро, но не принимает более двух аргументов, которые обрабатываются по functools.reduce.

Обратите внимание, что это все еще имеет некоторые избыточности: a) краткое сокращение не происходит на глобальном уровне b) Каждое из отдельных условий выполняется на всех исходных данных. Тем не менее, я ожидаю, что это будет достаточно эффективно для многих приложений, и это очень читаемо.

2295
задан 12 revs, 9 users 30% 7 December 2016 в 03:57
поделиться

12 ответов

Основная проблема в том, что по умолчанию браузер не делает холст «фокусируемым». Лучший обходной путь, который я мог придумать, - установить tabindex на холсте:

$("#canvas")
    // Add tab index to ensure the canvas retains focus
    .attr("tabindex", "0")
    // Mouse down override to prevent default browser controls from appearing
    .mousedown(function(){ $(this).focus(); return false; }) 
    .keydown(function(){ /* ... game logic ... */ return false; });

Если по какой-либо причине вы не можете установить tabindex , вы также можете сделать холст "фокусируемый", установив для contentEditable значение true:

// Add content editable to help ensure the canvas retains focus
$("#canvas").attr("contentEditable", "true")
$("#canvas")[0].contentEditable = true;

Это решение, которое я придумал изначально, но, на мой взгляд, оно немного сложнее, чем параметр tabindex .

Еще одна вещь, которую следует учитывать, заключается в том, что браузеры обычно выделяют редактируемые элементы содержимого рамкой. Некоторых пользователей это может оттолкнуть. К счастью, вы можете избавиться от этого с помощью этого фрагмента CSS:

#canvas { outline: none; }

Я тестировал оба решения в Chrome 3/4/5 и FireFox 3.0 / 3.5 / 3.6 в Windows XP, Mac OSX и Linux. Вот'

Думаю, стоит поделиться этим набором +30 юнит-тестов , сделанных для многочисленных реализаций функций, а также поделиться тем, который прошел все мои тесты:

function isNumeric(n) {
    return !isNaN(parseFloat(n)) && isFinite(n);
}

PS isNaN & isFinite имеют запутанное поведение из-за принудительного преобразования в число. В ES6 Number.isNaN и Number.isFinite исправят эти проблемы. Имейте это в виду при их использовании.


Обновление : Вот как это работает jQuery сейчас (2.2-стабильная) :

isNumeric: function(obj) {
    var realStringObj = obj && obj.toString();
    return !jQuery.isArray(obj) && (realStringObj - parseFloat(realStringObj) + 1) >= 0;
}

Обновление : Angular 4.3 :

export function isNumeric(value: any): boolean {
    return !isNaN(value - parseFloat(value));
}
2866
ответ дан 22 November 2019 в 19:55
поделиться

Да, встроенное isNaN(object) будет намного быстрее, чем какой-либо парсинг regex, потому что это встроено и скомпилировано вместо интерпретируемого на лету.

, Хотя результаты несколько отличаются от того, что Вы ищете ( попытка это ):

                                              // IS NUMERIC
document.write(!isNaN('-1') + "<br />");      // true
document.write(!isNaN('-1.5') + "<br />");    // true
document.write(!isNaN('0') + "<br />");       // true
document.write(!isNaN('0.42') + "<br />");    // true
document.write(!isNaN('.42') + "<br />");     // true
document.write(!isNaN('99,999') + "<br />");  // false
document.write(!isNaN('0x89f') + "<br />");   // true
document.write(!isNaN('#abcdef') + "<br />"); // false
document.write(!isNaN('1.2.3') + "<br />");   // false
document.write(!isNaN('') + "<br />");        // true
document.write(!isNaN('blah') + "<br />");    // false
33
ответ дан 4 revs, 2 users 72% 7 December 2016 в 03:57
поделиться

Используйте функцию isNaN. Я верю, тестируете ли Вы на !isNaN(yourstringhere), это хорошо работает для любой из этих ситуаций.

16
ответ дан 3 revs, 3 users 57% 7 December 2016 в 03:57
поделиться

Таким образом, кажется, работает хорошо:

function IsNumeric(input){
    var RE = /^-{0,1}\d*\.{0,1}\d+$/;
    return (RE.test(input));
}

И протестировать его:

// alert(TestIsNumeric());

function TestIsNumeric(){
    var results = ''
    results += (IsNumeric('-1')?"Pass":"Fail") + ": IsNumeric('-1') => true\n";
    results += (IsNumeric('-1.5')?"Pass":"Fail") + ": IsNumeric('-1.5') => true\n";
    results += (IsNumeric('0')?"Pass":"Fail") + ": IsNumeric('0') => true\n";
    results += (IsNumeric('0.42')?"Pass":"Fail") + ": IsNumeric('0.42') => true\n";
    results += (IsNumeric('.42')?"Pass":"Fail") + ": IsNumeric('.42') => true\n";
    results += (!IsNumeric('99,999')?"Pass":"Fail") + ": IsNumeric('99,999') => false\n";
    results += (!IsNumeric('0x89f')?"Pass":"Fail") + ": IsNumeric('0x89f') => false\n";
    results += (!IsNumeric('#abcdef')?"Pass":"Fail") + ": IsNumeric('#abcdef') => false\n";
    results += (!IsNumeric('1.2.3')?"Pass":"Fail") + ": IsNumeric('1.2.3') => false\n";
    results += (!IsNumeric('')?"Pass":"Fail") + ": IsNumeric('') => false\n";
    results += (!IsNumeric('blah')?"Pass":"Fail") + ": IsNumeric('blah') => false\n";

    return results;
}

я одолжил это regex от http://www.codetoad.com/javascript/isnumeric.asp . Объяснение:

/^ match beginning of string
-{0,1} optional negative sign
\d* optional digits
\.{0,1} optional decimal point
\d+ at least one digit
$/ match end of string
65
ответ дан Michael Haren 7 December 2016 в 03:57
поделиться
  • 1
    Я сделал все, любят описанный, но я все еще добираюсь no resource found [...] на android:theme="@style/Theme.Sherlock.Light.DarkActionBar". Возможно, Вы знаете то, чем еще это могло быть? – alex 24 July 2012 в 09:58

Я хотел бы добавить следующее:

1. IsNumeric('0x89f') => true
2. IsNumeric('075') => true

Положительные шестнадцатеричные числа запускаются с 0x, и отрицательные шестнадцатеричные числа запускаются с -0x. Положительные числа в октябре запускаются с 0, и отрицательные числа в октябре запускаются с -0. Этот берет большую часть того, что было уже упомянуто к рассмотрению, но включает шестнадцатеричные и восьмеричные числа, отрицательные научный, Бесконечность, и удалило научное десятичное число (4e3.2, не допустимо).

function IsNumeric(input){
  var RE = /^-?(0|INF|(0[1-7][0-7]*)|(0x[0-9a-fA-F]+)|((0|[1-9][0-9]*|(?=[\.,]))([\.,][0-9]+)?([eE]-?\d+)?))$/;
  return (RE.test(input));
}
5
ответ дан 4 revs, 3 users 78% 7 December 2016 в 03:57
поделиться

Несколько тестов для добавления:

IsNumeric('01.05') => false
IsNumeric('1.') => false
IsNumeric('.') => false

я придумал это:

function IsNumeric(input) {
    return /^-?(0|[1-9]\d*|(?=\.))(\.\d+)?$/.test(input);
}

покрытия решения:

  • дополнительный знак минус вначале
  • А единственный нуль или одна или несколько цифр, не запускающихся с 0, или ничто, пока период следует
  • период А, который сопровождается 1 или более числами
4
ответ дан pottedmeat 7 December 2016 в 03:57
поделиться

Это может обойтись без RegExp как

function IsNumeric(data){
    return parseFloat(data)==data;
}
11
ответ дан Aquatic 7 December 2016 в 03:57
поделиться
  • 1
    Это делает, кажется, фиксирует его! I' m собирающийся запускать некоторые тесты прежде, чем отметить это как ответ, но это делает кажется положительным! – Glenn85 3 May 2012 в 09:19

Arrrgh! Не слушайте ответы регулярного выражения. RegEx непригляден для этого, и я не говорю просто производительность. Настолько легко сделать тонким, невозможным определить ошибки с Вашим регулярным выражением.

, Если Вы не можете использовать isNaN(), это должно работать намного лучше:

function IsNumeric(input)
{
    return (input - 0) == input && (''+input).trim().length > 0;
}

Вот то, как это работает:

(input - 0) выражение вынуждает JavaScript сделать приведение типа на Вашем входном значении; это должно сначала быть интерпретировано как число для операции вычитания. Если то преобразование в число перестанет работать, выражение приведет к NaN. Это числовой результат тогда по сравнению с исходным значением, в котором Вы передали. Так как левая сторона является теперь числовой, введите приведение, снова используется. Теперь, когда вход с обеих сторон был принужден к тому же типу от того же исходного значения, Вы будете думать, что они должны всегда быть тем же (всегда верный). Однако существует специальное правило, в котором говорится NaN, никогда не равно NaN, и таким образом, значение, которое не может быть преобразовано в число (и только оценивает, который не может быть преобразован в числа) приведет ко лжи.

проверка на длине для особого случая, включающего пустые строки. Также обратите внимание, что это падает на Ваш тест 0x89f, но поэтому во многих средах это хорошо способ определить литерал числа. Если Вы хотите поймать тот определенный сценарий, Вы могли бы добавить дополнительную проверку. Еще лучше, если это - Ваша причина того, чтобы не использовать isNaN(), тогда просто обертывают Вашу собственную функцию [приблизительно 117], которые могут также сделать дополнительную проверку.

, Таким образом, , если Вы хотите знать, может ли значение быть преобразовано в число, на самом деле попытайтесь преобразовать его в число.

<час>

я возвратился и провел некоторое исследование для [1 112], почему пробельная строка не имела ожидаемого вывода, и я думаю, что получаю его теперь: пустая строка принуждена к 0, а не NaN. Просто обрезая строку, прежде чем проверка длины обработает этот случай.

Выполнение модульных тестов против нового кода и это только перестало работать на бесконечности и булевых литералах, и единственное время, которое должно быть проблемой, - то, при генерации кода (действительно, кто ввел бы в литерале и проверке, если это является числовым? Вы должны знать ), и это было бы некоторым странным кодом для генерации.

, Но, снова, единственная причина когда-либо для использования это - то, если по некоторым причинам необходимо избежать isNaN ().

329
ответ дан 16 revs, 2 users 91% 7 December 2016 в 03:57
поделиться

Вот очень прост один (протестированный в Chrome, Firefox и IE):

function isNumeric(x) {
  return parseFloat(x) == x;
}

Тесты от вопроса:

console.log('trues');
console.log(isNumeric('-1'));
console.log(isNumeric('-1.5'));
console.log(isNumeric('0'));
console.log(isNumeric('0.42'));
console.log(isNumeric('.42'));

console.log('falses');
console.log(isNumeric('99,999'));
console.log(isNumeric('0x89f'));
console.log(isNumeric('#abcdef'));
console.log(isNumeric('1.2.3'));
console.log(isNumeric(''));
console.log(isNumeric('blah'));

еще Некоторые тестовые сценарии:

console.log('trues');
console.log(isNumeric(0));
console.log(isNumeric(-1));
console.log(isNumeric(-500));
console.log(isNumeric(15000));
console.log(isNumeric(0.35));
console.log(isNumeric(-10.35));
console.log(isNumeric(2.534e25));
console.log(isNumeric('2.534e25'));
console.log(isNumeric('52334'));
console.log(isNumeric('-234'));
console.log(isNumeric(Infinity));
console.log(isNumeric(-Infinity));
console.log(isNumeric('Infinity'));
console.log(isNumeric('-Infinity'));

console.log('falses');
console.log(isNumeric(NaN));
console.log(isNumeric({}));
console.log(isNumeric([]));
console.log(isNumeric(''));
console.log(isNumeric('one'));
console.log(isNumeric(true));
console.log(isNumeric(false));
console.log(isNumeric());
console.log(isNumeric(undefined));
console.log(isNumeric(null));
console.log(isNumeric('-234aa'));

Примечание, что это считает бесконечность числом.

0
ответ дан MarredCheese 4 October 2019 в 07:14
поделиться

Yahoo! UI использует это:

isNumber: function(o) {
    return typeof o === 'number' && isFinite(o);
}
52
ответ дан 22 November 2019 в 19:55
поделиться
function IsNumeric(num) {
     return (num >=0 || num < 0);
}

Это также работает для номеров типа 0x23.

49
ответ дан 22 November 2019 в 19:55
поделиться

Для меня это лучший способ:

isNumber : function(v){
   return typeof v === 'number' && isFinite(v);
}
5
ответ дан 22 November 2019 в 19:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: