2014-12-04 3 views
4

То, что я пытаюсь сделать:«Try ... Catch» Блок не работает с ParseInt()

У меня есть яваскрипт программа, которая при нажатии кнопки, занимает в 4 строке из 4 текстовые поля в форме и выводит эти строки в форматированную текстовую область.

function testResults(form){ 
var errorhandle1 = parseInt(document.myForm.Item_Code.value); 
var errorhandle2 = parseInt(document.myForm.Item_Cost.value); 
var errorhandle3 = parseInt(document.myForm.Quantity.value); 
//above variables are for error handling. 
var d = " "; 
var subtotal = parseInt(form.Item_Cost.value) * parseInt(form.Quantity.value); 
var subtotalValue = parseInt(document.myForm.Subtotal.value); 
var testVar = "Item Code: " + form.Item_Code.value + d + 
       "Item Name: " + form.Item_Name.value + d + 
       "Item Cost: " + form.Item_Cost.value + d + 
       "Quantity: " + form.Quantity.value + '\n'; 


document.myForm.myTextarea.value += testVar; 
document.myForm.Subtotal.value = parseInt(subtotal) + subtotalValue; 
document.myForm.Sales_Tax.value = document.myForm.Subtotal.value * salestax; 
document.myForm.Total.value = parseInt(document.myForm.Subtotal.value) + parseFloat(document.myForm.Sales_Tax.value); 
} 

Приведенный выше код работает очень хорошо и делает именно то, что я хочу, чтобы он выполнял для моей программы.

try { 
    if ((isNaN(errorhandle3) == true) || (isNaN(errorhandle2) == true)) { 
     throw "Error1"; 
    } 
} catch (e) { 
    if (e == "Error1") { 
     alert("Error! You must enter a number into the qty and cost fields!"); 
    } 
} 

То, что я пытаюсь выполнить с Try ... Catch блок просто чтобы убедиться, что

document.myForm.Item_Code.value 
document.myForm.Item_Cost.value 
document.myForm.Quantity.value 

фактически номера.

Триггерные инструкции catch запускаются каждый раз, когда я запускаю программу, и мне все равно, что я помещаю в соответствующие текстовые поля. Я был бы очень признателен за понимание и понимание этого!

Также: я посмотрел на обе эти ссылки и не смог понять мою проблему. javascript parseInt return NaN for empty string http://www.w3schools.com/jsref/jsref_isnan.asp

+4

Это не имеет никакого смысла здесь, чтобы использовать 'попробовать/catch' вокруг чего-то это просто, что само по себе не бросать. Вы можете просто использовать строчный оператор 'if', а код будет проще и лучше работать. Я не вижу здесь никаких исключений. – jfriend00

+2

Совет: не проверяйте логические значения в '== true'. Это избыточно; 'if (isNaN (errorhandle3) || isNaN (errorhandle2))' читает лучше. – Ryan

+0

Спасибо вам за быстрый ответ. Я сейчас меняю их. – Fishbones

ответ

5

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

Вы можете увидеть способы, чтобы проверить, если что-то может быть разобрано в действительное число здесь: Validate decimal numbers in JavaScript - IsNumeric()

Это стоит прочитать подробно в хороших ответов там, но она сводится к тому, что-то вроде этого, который немного больше, чем вам нужно, но это общая цель:

function isNumber(n) { 
    return !isNaN(parseFloat(n)) && isFinite(n); 
} 

И, то нет никаких оснований для использования исключений в коде, так что вы можете сделать это:

if (!isNumber(errorhandle3) || !(isNumber(errorhandle2)) { 
    alert("Error! You must enter a number into the qty and cost fields!"); 
} 

Кроме того, в вашем коде некоторые свойства .Value выглядят так, может быть, они должны быть .value (в нижнем регистре).

+0

Я думаю, что это моя проблема, попробовав это сейчас. – Fishbones

+0

@Fishbones - также возможно '.Value' должно быть' .value'. – jfriend00

+0

Однако вы не можете на самом деле «ввести» бесконечное число в поле формы: D – Leo

0

В своем первом блоке кода

var errorhandle2 = parseInt(document.myForm.Item_Cost.Value); 
var errorhandle3 = parseInt(document.myForm.Quantity.Value); 

Вы используете Value, которые должны быть value, что это чувствительны к регистру.

Кстати, isNaN возвращает логическое значение, вы не должны сравнивать с true

Смежные вопросы