Если вы действительно хотите убедиться, что строка содержит только число, любое число (целое или с плавающей запятой) и ровно число, вы не можете использовать parseInt()
/ parseFloat()
, Number()
или !isNaN()
сами по себе. Обратите внимание, что !isNaN()
фактически возвращает true
, когда Number()
вернет число, и false
, когда оно вернет NaN
, поэтому я исключу его из остальной части обсуждения.
Проблема с parseFloat()
состоит в том, что он вернет число, если строка содержит любое число, даже если строка не содержит только и точно число:
parseFloat("2016-12-31") // returns 2016
parseFloat("1-1") // return 1
parseFloat("1.2.3") // returns 1.2
Проблема с Number()
заключается в том, что он вернет число в тех случаях, когда переданное значение вообще не является числом!
Number("") // returns 0
Number(" ") // returns 0
Number(" \u00A0 \t\n\r") // returns 0
Проблема с прокруткой вашего собственного регулярного выражения заключается в том, что если вы не создадите точное регулярное выражение для сопоставления числа с плавающей запятой, как Javascript распознает его, вы пропустите дела или узнаете случаи, в которых не следует. И даже если вы можете бросить свое собственное регулярное выражение, почему? Есть более простые встроенные способы сделать это.
Однако оказывается, что Number()
(и isNaN()
) делает правильные вещи для каждого случая, когда parseFloat()
возвращает число, когда это не должно, и наоборот. Поэтому, чтобы выяснить, является ли строка действительно точной и только числом, вызовите обе функции и посмотрите, вернут ли они оба true:
function isNumber(str) {
if (typeof str != "string") return false // we only process strings!
// could also coerce to string: str = ""+str
return !isNaN(str) && !isNaN(parseFloat(str))
}