2011-12-16 3 views
0

Я делаю простой калькулятор подсказок, чтобы помочь мне изучить Javascript. Проблема, которую я не могу решить, заключается в том, как компенсировать «плохой ввод».Новичка Javascript запрос о плохом вводе

В приведенном ниже коде, если пользователь вводит числовое значение ввода со знаком доллара $, результатом является NAN.

function tipAmount(){ 
var dinner=prompt("How much was dinner?"); 
result = dinner*.10; 

alert("Your tip is " +"$"+result); 

} 

Как исправить это.

+2

Как вы хотите, чтобы его обрабатывали? –

+0

Мой вопрос удваивается как способ подглядывать за вариантами того, что возможно. Так же, как «как можно проще», я просто не знаю. – user1102740

+0

О, подождите. Я понимаю что ты имеешь ввиду. Я хочу, чтобы $ был проигнорирован! – user1102740

ответ

1

Простейшим способом было бы проанализировать ввод в поплавок и посмотреть, возвращается ли NaN.

if (isNaN(parseFloat(dinner))) 
    alert("Bad Input") 

Сразу отметим, что 45.2WWW вернется 45,2, и поэтому выше будет проходить.

Если вы хотите, чтобы убедиться, что пользователь ввел именно это число, вы могли бы сделать что-то вроде этого:

var str = '3.445'; 
var num = parseFloat(str); 

if (isNaN(num) || str.length !== num.toString().length) 
    alert("Bad Input"); 
1

попытаться разобрать вход как поплавок или целое число в зависимости от ваших потребностей:

var dinner = parseFloat(prompt("How much was dinner?")); 

или

var dinner = parseInt(prompt("How much was dinner?")); 

этой функции возвращают 0 не могут ли они разбора вход в номер

0

Просто проверьте, если значение является числовым - JavaScript в IsNaN:

if (isNaN(dinner)) { 
    alert('Bad number, bub.'); 
    return; 
} 
2

Вы можете попытаться разобрать числовое значение с регулярным выражением:

var match = dinner.match(/\d+\.?\d*/); // parse with a regular expression 

if(!match) { // not able to parse 
    alert("wrong"); 
} 

var price = +match[0]; // convert to a number 

result = price * .10; 

Регулярное выражение /\d+\.?\d*/ означает: одну или несколько цифр и, возможно, точку с другими цифрами. Это означает, что, если, например, dinner - "$1.23", price будет номером 1.23. То же самое можно сказать о "$ 1.23" или "1.23 dollar" и т. Д. - номер будет выровнен с шаблоном, определенным регулярным выражением.

+1

+1 для регулярного выражения –

+0

не должно быть '/ \ d * \.? \ D * /', чтобы вы могли ввести '.5' –

+0

@Adam Rackis: Вы правы, но тогда все необязательно, и оно ничего не будет соответствовать ('' '' в самом начале уже будет соответствовать. – pimvdb

0

Или, если вы хотите, чтобы позволить пользователям вводить как - только номер или сумму с $ в начале, вы можете проверить на первый знак:

if(dinner.charAt(0) == '$') 
{ 
    dinner = dinner.substring(1); 
} 

Таким образом, всякий раз, когда типы пользователей $, ваше приложение просто удалит его. Если они введут нормальный номер будет вычислить наконечник для вас ...

1

Учитывая ваш подход использования предупреждений, следующие будут работать:

function tipAmount() { 
    var dinner=prompt("How much was dinner?"); 

    //convert "dinner" to a number, stripping out any non numeric data 
    dinner = Number(dinner.replace(/[^0-9\.]+/g,"")); 

    //any unknown data will convert to 0 
    if(dinner <= 0) { 
     alert("Please enter a valid amount"); 
     return false; 
    } 
    var result = dinner*.10; 
    alert("Your tip is " +"$"+result); 

    return true; 
} 

Пожалуйста наклонить больше!

+0

Nitpicking, но вы можете заменить '0-9' на' \ d' (цифру), а '.' не нужно экранировать. – pimvdb

+0

@pimvdb действительно. Он мог бы с радостью заменить обычное выражение, данное в вашем ответе. Благодарю. – Dave

+0

Преобразование строки в число и удаление других символов - это то, что я искал. Не понимая синтаксиса для достижения, это то, что я испытывал, пытаясь понять. благодаря – user1102740

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