I am learning more and more about Kotlin every day. I have found myself facing another interesting roadblock.
Using the code below, I want to write a check that verifies if the user actually entered a number. If not, I want to go back and ask them to enter again. If they DID enter a number, I want to value to proceed into the calculateTotal function. How would I check if an entry matches the criteria? Thanks in advance.
print("Enter the total of your bill : ")
var originalTotal: Double?
originalTotal = readLine()!!.toDouble()
if(originalTotal !is Double) {
println("You did not enter a valid entry:")
} else {
val taxTotal = calculateTotal(originalTotal)
println("Your total with standard tip is: $taxTotal")
}
The following is what I have. It only runs the first println and then gives the following error:
Exception in thread “main” kotlin.KotlinNullPointerException
at Simplest_versionKt.main(Simplest version.kt:10)
fun main(args: Array<String>) {
var originalTotal: Double?
do {
println("Please enter the total of your bill: ")
originalTotal= readLine()!!.toDoubleOrNull()
if(originalTotal == null){
println("Not a valid number, try again")
}
}while(originalTotal==null)
var tip = 0.15 * originalTotal
println("Your tip is: $tip")
var total = originalTotal + tip
println("Your total is: $total")
}
What about a function that only returns if the readLine() get a not null transformation:
fun <T> readLineNotNull(transformation: (String) -> T): T =
transformation(readLine() ?: "")?.let { return it } ?: readLineNotNull(transformation)
then use it like:
val myDouble = readLineNotNull { it.toDoubleOrNull() } // read line until a Double is entered
val notOne = readLineNotNull { if (it == "1") null else it.toDoubleOrNull() } // read line until it's diferent from "1" and is a Double