Предположим, у нас есть текстовое поле на странице:
<input type="text">
Посетитель вводит некоторые символы, и мы читаем эти символы через свойство value
текстового поля.
Теперь предположим, что текстовое поле представляет собой числовое значение. Я не могу определить такую вещь в текстовом поле - его значение всегда будет строковым значением. Что я могу сделать, так это преобразовать это значение в числовое значение:
Number(input.value)
Однако входное значение обрабатывается как StringNumericLiteral , а не NumericLiteral . Это означает, что эти входные значения разрешены (хотя они не являются числовыми литералами в JavaScript):
- значения с ведущими нулями (например, "000003")
- значение "Бесконечность"
- значения со знаком плюс (например, "+3")
Теперь давайте скажем, что - ради аргумента - я действительно хочу прочитать входное значение как NumericLiteral . Мне не нужны числа с ведущими нулями или знаком + и т. Д. Я думал, как мне это сделать, и вот что я придумал:
try {
var n = JSON.parse('{ "n": ' + this.value + ' }').n;
if (typeof n !== "number") {
throw "error";
}
// n is a Number value that represents the value of the text-box
} catch(e) {}
Это упрощенная версия кода, демоверсия доступна здесь:
http://vidasp.net/tinydemos/input-as-number.html
Примечание: я использую try-catch, потому что если входное значение не является допустимым значением JSON, вызов JSON.parse завершится неудачно (выдает ошибку).
Итак, что вы думаете об этом методе? Есть ли у него недостатки?
(Недостатком является то, что шестнадцатеричные числовые значения не могут быть прочитаны, поскольку JSON их не допускает.)
Я только что понял ...
... что причина, по которой я пытался это сделать, заключалась не в том, чтобы фактически прочитать ввод как число. Я хотел проверить, соответствует ли значение грамматике NumericLiteral - что легко может сделать проверка регулярного выражения.