проверить, является ли строка допустимым числом с плавающей точкой в ​​JavaScript - PullRequest
0 голосов
/ 10 октября 2018

Я хочу проверить, может ли строка быть приведена как float.Я пытался использовать parseFloat для достижения этой цели.

console.log(!isNaN(parseFloat("10000"))); // should return true
console.log(!isNaN(parseFloat("100T0"))); // should return false (but doesn't)

Оказывается , что parseFloat просто прекращает чтение строки, как только он попадает в символ, который не является цифрой, а затем возвращает все, что он передал, такдалеко.Таким образом, parseFloat("100T0") фактически возвращает 100, а не NaN.

Какой лучший js-тест, чтобы увидеть, может ли строка быть приведена как float?

Ответы [ 5 ]

0 голосов
/ 10 октября 2018

Вы можете попробовать регулярное выражение, чтобы соответствовать только строки формата float.Надеюсь, это поможет.

const reg = /^-?([0-9]+\.[0-9]+)$/g;

console.log("Should match");
console.log("123.2".match(reg));
console.log("12.000".match(reg));
console.log("-12.000".match(reg));

console.log("Should not match");
console.log("123".match(reg));
console.log("123a123".match(reg));
console.log("1e2".match(reg));
0 голосов
/ 10 октября 2018

Вы можете попробовать с обычным выражением:

> (/^-?[\d]*(\.[\d]+)?$/g).test('0');
true
> (/^-?[\d]*(\.[\d]+)?$/g).test('1000');
true
> (/^-?[\d]*(\.[\d]+)?$/g).test('10E0');
false
> (/^-?[\d]*(\.[\d]+)?$/g).test('1000.E');
false
> (/^-?[\d]*(\.[\d]+)?$/g).test('1000.1');
true
> (/^-?[\d]*(\.[\d]+)?$/g).test('1.1000');
true
> (/^-?[\d]*(\.[\d]+)?$/g).test('.1000');
true
> (/^-?[\d]*(\.[\d]+)?$/g).test('1000.');
false
> (/^-?[\d]*(\.[\d]+)?$/g).test('-.1');
true
> (/^-?[\d]*(\.[\d]+)?$/g).test('-1000.1');
true
> (/^-?[\d]*(\.[\d]+)?$/g).test('-1000');
true

С функцией:

function isValidFloat(str) {
    return (/^-?[\d]*(\.[\d]+)?$/g).test(str);
}
0 голосов
/ 10 октября 2018

Еще одна идея в psuedocode

1) Loop through string substrings (imitating parseFloat)
2) Get the substring that parseFloat stops at
3) Compare this substring to the original

Старый psuedocode - не работает полностью - возможно, с модификациями

Что вы можете сделать, это (psuedocode)

if (parseFloat (value)).toString() <> value then
   you know that the parse float only converted part of the value

По сути, вы говорите, что string> float> (back to) string должна давать ту же строку, если диалоги работают «правильно».

0 голосов
/ 10 октября 2018

Вы не получите того, что ожидаете, с parseFloat(), потому что он пытается проанализировать 100T0 и возвращает 100, поэтому он действителен Number.

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

Это регулярное выражение /^\-?[0-9]+(e[0-9]+)?(\.[0-9]+)?$/ вам нужно, и вот как должен быть ваш код:

function isItNumber(str) {
  return /^\-?[0-9]+(e[0-9]+)?(\.[0-9]+)?$/.test(str);
}

Демонстрация:

function isItNumber(str) {
  return /^\-?[0-9]+(e[0-9]+)?(\.[0-9]+)?$/.test(str);
}

console.log(isItNumber("10000")) // should return true
console.log(isItNumber("100T0"))
console.log(isItNumber("10e5"))
console.log(isItNumber("100.50"))
0 голосов
/ 10 октября 2018

Нет ни одной встроенной операции, предоставляемой по умолчанию в JavaScript, которая соответствовала бы разумному определению «эта строка - число» (на мой взгляд, в любом случае).Вы можете приблизиться с помощью Number, унарного + или неявного преобразования (просто передав строку непосредственно в isNaN), с оговоркой, что все они делают то же самое, что включает в себя "" как 0:

// Number
console.log(!isNaN(Number("10000"))); // true
console.log(!isNaN(Number("100T0"))); // false
console.log(!isNaN(Number("")));      // true (!)

// Same as implicit (here triggered with a unary +)
console.log(!isNaN(+"10000")); // true
console.log(!isNaN(+"100T0")); // false
console.log(!isNaN(+""));      // true (!)


// Same as implicit
console.log(!isNaN("10000")); // true
console.log(!isNaN("100T0")); // false
console.log(!isNaN(""));      // true (!)

Мой ответ на связанный вопрос подробно рассматривается в ваших вариантах.

Следовательно, вы можете сделать регулярное выражение (не забудьте указать научную запись!) или чек на "" заранее:

function toNumber(str) {
  str = String(str).trim();
  return !str ? NaN : Number(str);
}
console.log(!isNaN(toNumber("10000"))); // true
console.log(!isNaN(toNumber("100T0"))); // false
console.log(!isNaN(toNumber("")));      // false
...