promt , вычисление данных и проверка

Как сделать так , чтобы после того , как появилось: "Неверные входные данные" , пользователь вводил эту строку заново , а не переходил к заполнению следующей строки и еще вопрос , у меня почему-то переменная otvet вычисляет все то , что в скобках , а когда дело доходит до сложения , у меня вместо сложения просто добавления идет к значению startMoney, что-то такое 1100110 первые четыре это стартмоней , а последние три это вычисление в скобках?

function myFunction() {
   var startMoney;
   var years;
   var percent;
   var dayinyear = 365;
   startMoney = prompt("Введите начальную сумму", '')
      if (startMoney === '' || isNaN(startMoney) || startMoney <= 1000) {
         alert('Неверные входные данные');
      }  
   years = prompt("Введите срок", '')
      if(years === '' || isNaN(years) || years < 1) {
         alert('Неверные входные данные');
      }   
   percent = prompt("Введите процент", '')
      if (percent === '' || isNaN(percent) || percent > 100) {
         alert('Неверные входные данные');
      }
   else{
      alert("Начальная сумма: " + startMoney + " " + "Срок: " + years +" " + "Процент: " + percent);
      let otvet = startMoney + ((startMoney * percent * years * dayinyear) / (dayinyear * 100));
      alert(otvet);
   }
}

Ответы (2 шт):

Автор решения: Rudi

Можно заново вызывать эту же функцию, а чтобы не заполнять повторно правильные данные, передавать их в качестве аргумента и присваивать создаваемым переменным. Метод prompt возвращает строку, чтобы проводить вычисления нужно приводить к числу.

function myFunction() {
   var startMoney = arguments[0] ? arguments[0] : undefined;
   var years = arguments[1] ? arguments[1] : undefined;;
   var percent;
   var dayinyear = 365;
   var abort = 'Неверные входные данные';
   
   if(!startMoney) {   
      startMoney = Number(prompt("Введите начальную сумму", ''))
      if (startMoney === '' || isNaN(startMoney) || startMoney <= 1000) {
         alert(abort);
         return myFunction()
      }
    }
    if(!years){    
      years = Number(prompt("Введите срок", ''))
      if(years === '' || isNaN(years) || years < 1) {
         alert(abort);
         return myFunction(startMoney)
      }
    }
    if(!percent){    
      percent = Number(prompt("Введите процент", ''))
      if (percent === '' || isNaN(percent) || percent > 100) {
         alert(abort);
         return myFunction(startMoney, years)
      }
    }
    let otvet = startMoney + ((startMoney * percent * years * dayinyear) / (dayinyear * 100));
    alert("Начальная сумма: " + startMoney + " " + "Срок: " + years +" " + "Процент: " + percent + "\nОтвет : "+ otvet);
}
myFunction()

→ Ссылка
Автор решения: EzioMercer

Можно не вызывать одну и ту же ф-ию заново и заново, достаточно застрять на одном месте пока не будут введены нужные вам данные, чего можно легко добиться бесконечным циклом while

Пару замечаний:

  • После того как вы преобразуете строку в число Number(prompt('...')), то не надо проверять является ли он пустой строкой. Это уже число, потому достаточно проверять проверкой isNan(). Но учтите, что пустая строка будет преобразована в 0, потому вам это надо отдельно обрабатывать, если надо. Например когда вы просите проценты, то вы допускаете что было введено 0

  • Вы умножали и делили на одинаковое число dayInYear. Это бессмысленно, потому я убрал у себя это. Но возможно вам надо просто подправить формулу

Код:

const askNumber = (message) => Number(prompt(message));

const askSum = () => askNumber('Введите начальную сумму');
const askPeriod = () => askNumber('Введите срок');
const askPercent = () => askNumber('Введите процент');

const alertWrongData = () => alert('Неверные входные данные');

function myFunction() {
    let startMoney = askSum();

    while (isNaN(startMoney) || startMoney <= 1000) {
        alertWrongData();
        startMoney = askSum();
    }

    let years = askPeriod();

    while (isNaN(years) || years < 1) {
        alertWrongData();
        years = askPeriod();
    }

    let percent = askPercent();

    while (isNaN(percent) || percent > 100) {
        alertWrongData();
        percent = askPercent();
    }

    const answer = startMoney + startMoney * percent * years / 100;
    alert(`Начальная сумма: ${startMoney} Срок: ${years} Процент: ${percent}
Ответ : ${answer}`);
}

myFunction();

→ Ссылка