# wxPython / wx / tools / Editra / tests / syntax / groovy.groovy

 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73``` ```/** * Mortgage Calculator * @author: Jeremy Rayner * based on algorithms by Jeff Louie, Dr W Carlini and Newton */ println "__..::~~'''~~::..__" println "Mortgage Calculator" println "~~~~~~~~~~~~~~~~~~~" println "Please input 3 of the 4 values in your mortgage calculation" println "This program will then calculate the value you leave blank" println "" def variables = [ "Amount of mortgage" : 0.0, "Annual interest rate (%)" : 0.0, "Loan duration (months)" : 0.0, "Monthly payments" : 0.0 ] for (entry in variables.entrySet()) { print("\${entry.key}:") def userInput = System.in.readLine() if ("" == userInput) { valueToCalculate = entry.key } else { entry.value = userInput.toDouble() } } println "\$valueToCalculate = \${calculateValueOf(valueToCalculate)}" def calculateValueOf(valueToCalculate) { def result = 0 def principal = variables["Amount of mortgage"] def interest = variables["Annual interest rate (%)"] / 1200 def months = variables["Loan duration (months)"] def payment = variables["Monthly payments"] switch (valueToCalculate) { case "Amount of mortgage": result = 1 + interest result = 1/Math.pow(result,months) result = ((1-result)/interest) * payment break case "Loan duration (months)": result = (1 - (principal * interest / payment)) result = Math.log(result) result = - result / Math.log(1 + interest) break case "Monthly payments": result = 1 + interest result = 1 / Math.pow(result,months) result = (principal * interest) / (1 - result) break case "Annual interest rate (%)": result = payment / principal def diff = 100; def accuracy = 0.00001; def maxIterations = 1000 def index = 0 while ((diff > accuracy) && (index < maxIterations)) { def temp = result def numerator = (principal * temp / payment) + Math.pow((1 + temp), -months) - 1 def denominator= (principal / payment) - months * Math.pow((1 + temp), (-months - 1)) result = temp - (numerator / denominator) diff = result - temp diff = Math.abs(diff) index++ } result *= 1200 break } return result } ```