Kotlin:检查字符串是否为数字
有没有一种简单的方法来检查用户的输入是否为数字?在这里使用正则表达式和异常似乎太复杂了。
fun main {
val scan = Scanner(System.`in`)
val input = scanner.nextLine()
if (!input.isNumeric) {
println("You should enter a number!")
}
}
回答
加入所有有用的评论并将其放入输入流上下文中,您可以使用以下示例:
fun readLn() = readLine()!!
fun readNumericOnly() {
println("Enter a number")
readLn().toDoubleOrNull()?.let { userInputAsDouble ->
println("user input as a Double $userInputAsDouble")
println("user input as an Int ${userInputAsDouble.toInt()}")
} ?: print("Not a number")
}
readNumericOnly()
输入:10
user input as a Double 10.0
user input as an Int 10
输入:0.1
user input as a Double 0.1
user input as an Int 0
对于输入:“单词”
Not a number
回答
该方法上面提到的将一个工作number <= approximately 4*10^18的本质最大限制Double。
与其这样做,因为String它本身是一个 CharSequence,您可以检查所有字符是否属于特定范围。
val integerChars = '0'..'9'
fun isNumber(input: String): Boolean {
var dotOccurred = 0
return input.all { it in integerChars || it == '.' && dotOccurred++ < 1 }
}
fun isInteger(input: String) = input.all { it in integerChars }
fun main() {
val input = readLine()!!
println("isNumber: ${isNumber(input)}")
println("isInteger: ${isInteger(input)}")
}
例子:
100234
isNumber: true
isInteger: true
235.22
isNumber: true
isInteger: false
102948012120948129049012849102841209849018
isNumber: true
isInteger: true
a
isNumber: false
isInteger: false
它也很高效,没有内存分配,只要发现任何不满足的条件就返回。
您还可以通过更改逻辑来包括检查负数,如果连字符是第一个字母,您可以应用subSequence(1, length)跳过第一个字符的条件。
- So as a general rule, don't mention "above" in an answer; answer order changes when your answer is accepted or upvoted 😉