Подтвердить что ты не робот

Javascript строка/целочисленные сравнения

Я храню некоторые параметры клиентской стороны в HTML, а затем вам нужно сравнить их как целые числа. К сожалению, я столкнулся с серьезной ошибкой, которую я не могу объяснить. Кажется, что ошибка заключается в том, что мой JS считывает параметры как строки, а не целые числа, что приводит к сбою моих целых сравнений.

Я создал небольшой пример ошибки, которую я также не могу объяснить. Следующий результат возвращает "true" при запуске:

javascript:alert("2">"10")
4b9b3361

Ответ 1

Разделите строку на целое число с помощью parseInt:

javascript:alert(parseInt("2", 10)>parseInt("10", 10))

Ответ 2

Проверка того, что строки являются целыми, является раздельным для сравнения, если один больше или меньше другого. Вы всегда должны сравнивать число с числом и строкой со строкой, поскольку алгоритм для работы со смешанными типами не так легко запомнить.

'00100' < '1' // true

так как они оба являются строками, поэтому только первый нуль "00100" сравнивается с "1", и поскольку он charCode ниже, он оценивается как ниже.

Однако:

'00100' < 1 // false

поскольку RHS является числом, LHS преобразуется в число перед сравнением.

Простая проверка целых чисел:

function isInt(n) {
  return /^[+-]?\d+$/.test(n);
}

Не имеет значения, является ли n числом или целым числом, оно будет преобразовано в строку перед тестом.

Если вы действительно заботитесь о производительности, то:

var isInt = (function() {
  var re = /^[+-]?\d+$/;

  return function(n) {
    return re.test(n);
  }
}());

Отмечая, что цифры типа 1.0 вернут false. Если вы хотите также считать такие числа целыми числами, то:

var isInt = (function() {
  var re = /^[+-]?\d+$/;
  var re2 = /\.0+$/;

  return function(n) {
    return re.test((''+ n).replace(re2,''));
  }
}());

Как только этот тест пройден, преобразование в число для сравнения может использовать ряд методов. Мне не нравится parseInt(), потому что он будет обрезать float, чтобы они выглядели как ints, поэтому все следующие будут "равными":

parseInt(2.9) == parseInt('002',10) == parseInt('2wewe')

и т.д.

Как только числа проверены как целые числа, вы можете использовать оператор унарного + для преобразования их в числа в сравнении:

if (isInt(a) && isInt(b)) {
  if (+a < +b) {
    // a and b are integers and a is less than b
  }
}

Другие методы:

Number(a); // liked by some because it clear what is happening
a * 1      // Not really obvious but it works, I don't like it

Ответ 3

Сравнение чисел с эквивалентами строк без использования parseInt

console.log(Number('2') > Number('10'));
console.log( ('2'/1) > ('10'/1) );

var item = { id: 998 }, id = '998';
var isEqual = (item.id.toString() === id.toString());
isEqual;

Ответ 4

используйте parseInt и сравните, как показано ниже:

javascript:alert(parseInt("2")>parseInt("10"))

Ответ 5

Ответ прост. Просто разделите строку на 1. Примеры:

"2" > "10"   - true

но

"2"/1 > "10"/1 - false

Также вы можете проверить, действительно ли строковое значение является числом:

!isNaN("1"/1) - true (number)
!isNaN("1a"/1) - false (string)
!isNaN("01"/1) - true (number)
!isNaN(" 1"/1) - true (number)
!isNaN(" 1abc"/1) - false (string)

Но

!isNaN(""/1) - true (but string)

Решение

number !== "" && !isNaN(number/1)

Ответ 6

Предупреждение() хочет отобразить строку, поэтому она будет интерпретировать "2" > "10" в виде строки.

Используйте следующее:

var greater = parseInt("2") > parseInt("10");
alert("Is greater than? " + greater);

var less = parseInt("2") < parseInt("10");
alert("Is less than? " + less);

Ответ 7

Всегда помните, когда мы сравниваем две строки. сравнение происходит на основе характера. поэтому '2'> '12' истинно, потому что сравнение будет происходить как '2'> '1', а в алфавитном порядке '2' всегда больше, чем '1' в юникоде. ТАК это получится правдой. Надеюсь, это поможет.