2017-06-20 51 views
0

我有一個抵押計算器,我已經建立了。除了一個小錯誤,一切似乎都很好。有兩個輸入字段帶有一個按鈕,它們都帶有整數,並通過一系列計算來運行它們以查找抵押的許多屬性(即每月支付,剩餘貸款餘額等)。只有當我輸入兩個連續的整數時,輸入字段沒有運行功能

現在我遇到的問題只在預付費領域。如果我連續輸入兩個整數,則不會處理新的每月付款。如果我做兩個百分比或整數 - {計算} - 百分比 - {計算} - 整數 - {計算}它會正確計算。

這裏是我覺得代碼有問題:

// User Data Object 
 
var userData = {}; 
 

 
// Gather User Data from form than display results above form 
 
function calculateUserMontlyPayments() { 
 
    userData.salePrice = 0; 
 
    userData.downPayment = 0; 
 
    userData.salePrice = document.getElementById("userHomePrice").value; 
 
    userData.downPayment = document.getElementById("userDownPayment").value; 
 
    //MortgageCalculator.calculateMortgage().calculateLoanAmount(userData.downPayment); 
 
    var results = MortgageCalculator.calculateMortgage(userData); 
 
    document.getElementById("userPayments").innerHTML = '$' + results.fullMonthlyPayment; 
 
    document.getElementById("allInfo").innerHTML = results.downPayment; 
 
}; 
 

 

 
var MortgageCalculator = { 
 
    calculateMortgage: function(options) { 
 
    Date.isLeapYear = function(year) { 
 
     return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)); 
 
     console.log('Leap Year'); 
 
    }; 
 

 
    Date.getDaysInMonth = function(year, month) { 
 
     return [31, (Date.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]; 
 
    }; 
 

 
    Date.prototype.isLeapYear = function() { 
 
     var y = this.getFullYear(); 
 
     return (((y % 4 === 0) && (y % 100 !== 0)) || (y % 400 === 0)); 
 
    }; 
 

 
    Date.prototype.getDaysInMonth = function() { 
 
     return Date.getDaysInMonth(this.getFullYear(), this.getMonth()); 
 
    }; 
 

 
    Date.prototype.addMonths = function(value) { 
 
     var n = this.getDate(); 
 
     this.setDate(1); 
 
     this.setMonth(this.getMonth() + value); 
 
     this.setDate(Math.min(n, this.getDaysInMonth())); 
 
     return this; 
 
    }; 
 

 
    function initOptions(options) { 
 
     var mortgage = {}; 
 
     mortgage.loanTermMonths = options.loanTermMonths || 12 * 30; 
 
     mortgage.salePrice = options.salePrice || 500000; 
 
     mortgage.interestRate = options.interestRate || 5.00; 
 
     mortgage.downPayment = options.downPayment || '20%'; 
 
     mortgage.salePrice = options.salePrice || 500000; 
 
     mortgage.extras = options.extras || []; 
 
     mortgage.propertyTaxRate = options.propertyTaxRate || .78; 
 
     mortgage.homeInsurance = options.homeInsurance || 0.22; 
 
     mortgage.adjustFixedRateMonths = options.adjustFixedRateMonths || 0; 
 
     mortgage.adjustInitialCap = options.adjustInitialCap || 0; 
 
     mortgage.adjustPeriodicCap = options.adjustPeriodicCap || 0; 
 
     mortgage.adjustLifetimeCap = options.adjustLifetimeCap || 0; 
 
     mortgage.adjustIntervalMonths = options.adjustIntervalMonths || 12; 
 
     mortgage.startDate = options.startDate || new Date(); 
 
     return mortgage; 
 
    } 
 

 
    function calculateLoanAmount(mortgage) { 
 
     var loanAmount; 
 
     if (typeof mortgage.downPayment == 'string') { 
 
     var downPercent = mortgage.downPayment.substr(0, mortgage.downPayment.indexOf('%')); 
 
     loanAmount = mortgage.salePrice - (mortgage.salePrice * (downPercent/100)); 
 
     } else { 
 
     loanAmount = mortgage.salePrice - mortgage.downPayment; 
 
     } 
 

 
     return loanAmount; 
 
    } 
 

 
    function roundDecimals(num) { 
 
     var decimals = 2; 
 
     return Math.round(num * Math.pow(10, decimals))/Math.pow(10, decimals); 
 
    } 
 

 
    function roundAmortizationValues(amortization) { 
 
     amortization.monthlyPayment = roundDecimals(amortization.monthlyPayment); 
 
     amortization.interest = roundDecimals(amortization.interest); 
 
     amortization.interestToDate = roundDecimals(amortization.interestToDate); 
 
     amortization.interestLoanYearToDate = roundDecimals(amortization.interestLoanYearToDate); 
 
     amortization.principal = roundDecimals(amortization.principal); 
 
     amortization.principalLoanYearToDate = roundDecimals(amortization.principalLoanYearToDate); 
 
     amortization.principalToDate = roundDecimals(amortization.principalToDate); 
 
     amortization.extra = roundDecimals(amortization.extra); 
 
     amortization.principalTotal = roundDecimals(amortization.principalTotal); 
 
     amortization.paymentTotal = roundDecimals(amortization.paymentTotal); 
 

 
     return amortization; 
 
    } 
 

 
    function calculateExtraPayment(mortgage, loanMonth) { 
 
     var totalExtra = 0; 
 
     if (mortgage.extras) { 
 
     for (var i in mortgage.extras) { 
 
      var extra = mortgage.extras[i]; 
 
      if (loanMonth >= extra.startMonth && loanMonth <= extra.endMonth) { 
 
      if ((loanMonth - extra.startMonth) % extra.extraIntervalMonths == 0) { 
 
       totalExtra += extra.extraAmount * 100; 
 
      } 
 
      } 
 
     } 
 
     } 
 

 
     return totalExtra; 
 
    } 
 

 
    function aprToMonthlyInterest(apr) { 
 
     return apr/(12 * 100); 
 
    } 
 

 
    function calculatePropertyTax(mortgage) { 
 
     var monthlyPropertyTax; 
 
     if (mortgage.propertyTaxRate && mortgage.propertyTaxRate > 0) { 
 
     monthlyPropertyTax = (mortgage.salePrice * 100 * (mortgage.propertyTaxRate/100))/12; 
 
     } else { 
 
     monthlyPropertyTax = 0; 
 
     } 
 
     return monthlyPropertyTax; 
 
    } 
 

 
    function calculateHomeInsurance(mortgage) { 
 
     var monthlyHomeInsurance; 
 
     if (mortgage.homeInsurance && mortgage.homeInsurance > 0) { 
 
     monthlyHomeInsurance = (mortgage.salePrice * 100 * (mortgage.homeInsurance/100))/12; 
 
     } else { 
 
     monthlyHomeInsurance = 0; 
 
     } 
 
     return monthlyHomeInsurance; 
 
    } 
 

 
    /** 
 
    * Mortgage needs reset if this mortgage is ARM and current loam month falls into 
 
    * new interest period. 
 
    * 
 
    * @param mortgage 
 
    * @param loanMonth 
 
    */ 
 
    function needsInterestReset(mortgage, loanMonth) { 
 
     if (mortgage.adjustFixedRateMonths <= 0 || loanMonth <= mortgage.adjustFixedRateMonths) { 
 
     return false; 
 
     } 
 

 
     return (loanMonth - mortgage.adjustFixedRateMonths - 1) % mortgage.adjustIntervalMonths == 0; 
 
    } 
 

 
    function calculateInterestRate(mortgage, loanMonth) { 
 
     if (mortgage.adjustFixedRateMonths <= 0 || loanMonth <= mortgage.adjustFixedRateMonths) { 
 
     return mortgage.interestRate; 
 
     } 
 

 
     var armInterestRate = mortgage.interestRate + mortgage.adjustInitialCap; 
 
     if (loanMonth > mortgage.adjustFixedRateMonths + 1) { 
 
     for (var i = mortgage.adjustFixedRateMonths + mortgage.adjustIntervalMonths; i <= loanMonth; i += mortgage.adjustIntervalMonths) { 
 
      armInterestRate += mortgage.adjustPeriodicCap; 
 
     } 
 
     } 
 

 
     armInterestRate = Math.min(armInterestRate, mortgage.adjustLifetimeCap + mortgage.interestRate) 
 

 
     return armInterestRate; 
 
    } 
 

 
    function calculateMonthlyPayment(loanAmount, loanTermMonths, interestRate) { 
 
     var monthlyInterestRate = aprToMonthlyInterest(interestRate); 
 
     var monthlyPayment = loanAmount * (monthlyInterestRate * Math.pow(1 + monthlyInterestRate, loanTermMonths))/
 
     (Math.pow(1 + monthlyInterestRate, loanTermMonths) - 1); 
 
     return monthlyPayment; 
 
    } 
 

 
    function calculateAmortizations(mortgage) { 
 

 
     //To avoid rounding errors, all dollars will be converted to cents and converted back to dollars 
 
     //to response objects. 
 
     var remainingLoanAmountInCents = mortgage.loanAmount * 100; 
 
     var loanAmountInCents = mortgage.loanAmount * 100; 
 
     var monthlyPropertyTaxInCents = calculatePropertyTax(mortgage); 
 
     var monthlyHomeInsuranceInCents = calculateHomeInsurance(mortgage); 
 
     var amortizations = []; 
 
     var previousAmortization; 
 
     var loanMonth = 0; 
 
     var loanYear = 1; 
 
     var loanYearRollUpSummary = {}; 
 
     var currentInterestRate = calculateInterestRate(mortgage, 1); 
 
     var currentMonthlyPaymentInCents = calculateMonthlyPayment(remainingLoanAmountInCents, mortgage.loanTermMonths, currentInterestRate); 
 
     var rollupSummaryFields = ['interest', 'principal', 'extra', 'principalTotal', 'propertyTax', 'paymentTotal']; 
 

 
     while (remainingLoanAmountInCents >= 1) { 
 
     loanMonth++ 
 
     var amortization = {}; 
 

 
     if (needsInterestReset(mortgage, loanMonth)) { 
 
      currentInterestRate = calculateInterestRate(mortgage, loanMonth); 
 
      currentMonthlyPaymentInCents = calculateMonthlyPayment(remainingLoanAmountInCents, mortgage.loanTermMonths + 1 - loanMonth, currentInterestRate); 
 
     } 
 

 
     amortization.interestRate = currentInterestRate; 
 
     amortization.scheduledMonthlyPayment = currentMonthlyPaymentInCents; 
 
     amortization.interest = remainingLoanAmountInCents * aprToMonthlyInterest(amortization.interestRate); 
 
     amortization.principal = currentMonthlyPaymentInCents - amortization.interest; 
 

 
     if (remainingLoanAmountInCents < amortization.principal) { 
 
      amortization.principal = remainingLoanAmountInCents; 
 
      amortization.extra = 0; 
 
     } else { 
 
      amortization.extra = calculateExtraPayment(mortgage, loanMonth); 
 
     } 
 

 
     amortization.principalTotal = amortization.principal + amortization.extra; 
 

 
     amortization.propertyTax = monthlyPropertyTaxInCents; 
 

 
     amortization.homeInsurance = monthlyHomeInsuranceInCents; 
 

 
     amortization.paymentTotal = amortization.interest + amortization.principalTotal + monthlyPropertyTaxInCents + monthlyHomeInsuranceInCents; 
 

 
     //amortization.paymentDate = new Date(mortgage.startDate.getTime()).addMonths(loanMonth); 
 

 
     remainingLoanAmountInCents -= amortization.principalTotal; 
 

 
     //If remaining loan amount is less than zero, then set it to zero. 
 
     if (remainingLoanAmountInCents < 0) { 
 
      remainingLoanAmountInCents = 0; 
 
     } 
 
     amortization.remainingLoanBalnce = remainingLoanAmountInCents; 
 

 
     amortization.loanMonth = loanMonth; 
 
     amortization.loanYear = loanYear; 
 
     rollupSummaryFields.map(function(field) { 
 
      if (loanYearRollUpSummary[field]) { 
 
      loanYearRollUpSummary[field] += amortization[field]; 
 
      } else { 
 
      loanYearRollUpSummary[field] = amortization[field]; 
 
      } 
 

 
      amortization[field + 'LoanYearToDate'] = loanYearRollUpSummary[field]; 
 
     }); 
 

 
     if (loanMonth % 12 === 0) { 
 
      loanYearRollUpSummary = {}; 
 
      loanYear++; 
 
     } 
 

 
     rollupSummaryFields.map(function(field) { 
 
      if (previousAmortization) { 
 
      amortization[field + 'ToDate'] = previousAmortization[field + 'ToDate'] + amortization[field]; 
 
      } else { 
 
      amortization[field + 'ToDate'] = amortization[field]; 
 
      } 
 
     }); 
 

 
     previousAmortization = amortization; 
 
     amortizations.push(amortization); 
 
     } 
 

 

 
     //Round all amortization values to dollars. 
 
     mortgage.totalLoanCost = 0; 
 
     var additionalFieldsToProcess = ['scheduledMonthlyPayment', 'remainingLoanBalnce']; 
 

 
     for (var i = 0; i < amortizations.length; i++) { 
 
     var amortization = amortizations[i]; 
 
     rollupSummaryFields.map(function(field) { 
 
      amortization[field] = roundDecimals(amortization[field]/100); 
 
      amortization[field + 'ToDate'] = roundDecimals(amortization[field + 'ToDate']/100); 
 
      amortization[field + 'LoanYearToDate'] = roundDecimals(amortization[field + 'LoanYearToDate']/100); 
 
     }); 
 

 
     additionalFieldsToProcess.map(function(field) { 
 
      amortization[field] = roundDecimals(amortization[field]/100); 
 
     }); 
 

 
     mortgage.totalLoanCost += amortization.interest; 
 
     } 
 

 
     mortgage.totalLoanCost = roundDecimals(mortgage.totalLoanCost); 
 
     mortgage.paymentSchedule = amortizations; 
 
     mortgage.numberOfPayments = mortgage.paymentSchedule.length; 
 
     mortgage.monthlyPayment = mortgage.paymentSchedule[0].scheduledMonthlyPayment; 
 
     mortgage.fullMonthlyPayment = amortization.paymentTotal; 
 
    } 
 

 
    var mortgage = initOptions(options); 
 

 
    mortgage.loanAmount = calculateLoanAmount(mortgage); 
 
    calculateAmortizations(mortgage); 
 
    return mortgage; 
 
    } 
 
}
<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 
    <meta charset="utf-8"> 
 
    <title>Mortgage Calculator</title> 
 

 
    <script src="https://code.jquery.com/jquery-3.2.1.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script> 
 

 
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script> 
 

 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> 
 

 
    <style media="screen"> 
 
    input:focus { 
 
    outline: none; 
 
    } 
 
    </style> 
 

 
</head> 
 

 
<body> 
 

 

 

 
    <div class="row"> 
 
    <div class="col-sm-12 push-20 text-center"> 
 
    <h5 class="push-10">Monthly Payments</h5> 
 
    <h2 id="userPayments">$0</h2> 
 
    </div> 
 
    <div class="col-sm-offset-2 col-sm-4 text-center"> 
 
    <input id="userHomePrice" type="text" name="Home Price" value="538000" placeholder="Home Price"> 
 
    </div> 
 
    <div class="col-sm-4 text-center"> 
 
    <input id="userDownPayment" type="text" name="Interest Price" value="20%" placeholder="Down Payment"> 
 
    </div> 
 
    <div class="col-sm-12 push-20 text-center"> 
 
    <button onclick="calculateUserMontlyPayments()">Submit</button> 
 
    </div> 
 
    <div class="col-sm-12 text-center"> 
 
    <h5>results.downPayment</h5> 
 
    </div> 
 
    <div class="col-sm-12 text-center"> 
 
    <p id="allInfo"></p> 
 
    </div> 
 
    </div> 
 

 

 

 

 

 

 
    <script type="text/javascript" src="mortgage-calculator.js"></script> 
 

 

 

 

 
</body> 
 

 
</html>

我依然很綠,當涉及到JavaScript和我現在只是最後的地方,我可以實現點原始的源代碼並將其插入到項目中,所以如果我的措辭不正確,或者這是一個常見的錯誤,我表示歉意。我似乎無法提出足夠好的問題來找到已經在網上寫過的答案。

+0

您的片段不工作,把它放在你的代碼的結尾 –

回答

0

無論輸入的值如何,HTML中的輸入字段實際上都會返回字符串。 (請參閱here以供參考)。我不確定它爲什麼有時會起作用,並且在其他時候不起作用,但我建議不要檢查輸入類型是否是字符串,而是檢查它是否包含%。希望這可以幫助。

+0

爲什麼它會在第一次使用整數時工作?只是不是第二次。 –

0

我無法測試,爲您的片斷被打破,但我想這一切,你需要做的是確保字段的值被解釋爲數字:

function calculateUserMontlyPayments() { 
    userData.salePrice = parseFloat(document.getElementById("userHomePrice").value) || 0; 
    userData.downPayment = parseFloat(document.getElementById("userDownPayment").value) || 0; 
    var results = MortgageCalculator.calculateMortgage(userData); 
    document.getElementById("userPayments").innerHTML = '$' + results.fullMonthlyPayment; 
    document.getElementById("allInfo").innerHTML = '' + results.downPayment; 
}; 
+0

我修復了剪掉的抱歉。它對我來說很奇怪,它與第一個值輸入一起工作,例如。 10000但不是第二次。如果我將輸入更改爲%並返回到數字,則會再次工作。 –

相關問題