2013-03-26 2 views
0

JavaScript parseInt() не работает так же, как Java parseInt().Определить, имеет ли строка какие-либо нецелые символы, в JavaScript

Очень простой пример:

document.write(parseInt(" 60 ") + "<br>"); //returns 60 
document.write(parseInt("40 years") + "<br>"); //returns 40 
document.write(parseInt("He was 40") + "<br>"); //returns NaN 

Линия 1 нормально. но я ожидаю, что строка 2 даст ошибку, так как вы не можете преобразовать «годы» в целое число. Я считаю, что JavaScript parseInt() просто проверяет, являются ли первые несколько символов в String целыми.

Так как я могу проверить, что до тех пор, пока в строке не будут целые числа, он вернет NaN?

+0

Почему Javascript 'parseInt' ведут себя так же, как Java' parseInt' только потому, что они назвали то же самое? Они функционируют на двух совершенно разных языках! – Celada

+0

@Celada: Ожидание JavaScript, похожего на Java, понятно из-за сходства их имен. Конечно, это сходство вводит в заблуждение; JavaScript не является производным от Java. Название, по-видимому, было выбрано по маркетинговым соображениям. Это объясняет статья [Wikipedia JavaScript] (http://en.wikipedia.org/wiki/JavaScript#Birth_at_Netscape). –

ответ

4

parseInt предназначен для некоторой гибкости при анализе целых чисел. Конструктор Number менее гибок с дополнительными символами, но и анализировать, не являющиеся целые числа (спасибо Alex):

console.log(Number(" 60 ")); // 60 
console.log(Number("40 years")); // Nan 
console.log(Number("He was 40")); // NaN 
console.log(Number("1.24")); // 1.24 

В качестве альтернативы, использовать регулярное выражение.

" 60 ".match(/^[0-9 ]+$/); // [" 60 "] 
" 60 or whatever".match(/^[0-9 ]+$/); // null 
"1.24".match(/^[0-9 ]+$/); // null 
+1

Я понятия не имею, если это вообще имеет значение, а только для справки. Число («1.23») получит 1.23, parseInt («1.23») получит всего 1, это может иметь значение, или это может быть неуместно – Alex

+0

@Alex Очень хорошая точка. Спасибо, что подняли его. – svidgen

+0

parseInt (Number ("1.24")) должен давать желаемое поведение. Скорее некрасиво, если вы спросите меня. – Alex

0

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

function(myString) { 
    if (myString.match(/^\d+$/) === null) { // null if non-digits in string 
    return NaN 
    } else { 
    return parseInt(myString.match(/^\d+$/)) 
    } 
} 
0

я хотел бы использовать регулярное выражение, может быть что-то вроде следующего.

 
function parseIntStrict(stringValue) { 
    if (/^[\d\s]+$/.test(stringValue)) // allows for digits or whitespace 
    { 
     return parseInt(stringValue); 
    } 
    else 
    { 
     return NaN; 
    } 
} 

+1

Как насчет 2.654e3? – RobG

+0

Хорошая точка, может добавить их в регулярное выражение, но тогда есть некоторые строки, которые, вероятно, проскальзывают. Op сказал какие-то нецелые символы, но все же хороший момент. – Alex

0

Самый простой способ, вероятно, использует унарный оператор плюс:

var n = +str; 

Это будет также анализировать значения с плавающей точкой, хотя.

0

Ниже в isInteger функцию, которая может быть добавлен ко всем объектам Струнные:

// If the isInteger function isn't already defined 
if (typeof String.prototype.isInteger == 'undefined') { 

    // Returns false if any non-numeric characters (other than leading 
    // or trailing whitespace, and a leading plus or minus sign) are found. 
    // 
    String.prototype.isInteger = function() { 
     return !(this.replace(/^\s+|\s+$/g, '').replace(/^[-+]/, '').match(/\D/)); 
    } 
} 

'60'.isInteger()  // true 
'-60'.isInteger()  // true (leading minus sign is okay) 
'+60'.isInteger()  // true (leading plus sign is okay) 
' 60 '.isInteger()  // true (whitespace at beginning or end is okay) 

'a60'.isInteger()  // false (has alphabetic characters) 
'60a'.isInteger()  // false (has alphabetic characters) 
'6.0'.isInteger()  // false (has a decimal point) 
' 60 40 '.isInteger() // false (whitespace in the middle is not okay) 
Смежные вопросы