Kotlin:检查字符串是否为数字

k3fezbri  于 2022-11-16  发布在  Kotlin
关注(0)|答案(6)|浏览(811)

有没有一个简单的方法来检查用户的输入是否是数字?使用正则表达式和异常似乎太复杂了。

fun main {
    val scan = Scanner(System.`in`)
    val input = scanner.nextLine()
    if (!input.isNumeric) {
        println("You should enter a number!")
    }
}
jjhzyzn0

jjhzyzn01#

上述方法将对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)的条件,跳过第一个字符。

xqkwcwgp

xqkwcwgp2#

加入所有有用的注解并将其放入输入流上下文中,您可以使用以下示例:

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

对于输入:“word”

Not a number
6ie5vjzr

6ie5vjzr3#

只需用途:在Kotlintext.isDigitsOnly()

u7up0aaq

u7up0aaq4#

这里的所有答案都最适合自己的情况:但并非所有字符串都是数字,它可以有(-)和(.)十进制指针。
因此,为了实现这一点,我做了一个鸡尾酒的所有答案建议下面和其他职位以及-看起来像下面:

fun isPosOrNegNumber(s: String?) : Boolean {
    return if (s.isNullOrEmpty()) false 
    else{
        if(s.first()=='-' && s.filter { it == '.' }.count() <= 1) {
            s.removeRange(0,1).replace(".","").all{Character.isDigit(it)}
        }
        else s.all {Character.isDigit(it)}
    }
}

上面的代码很好地实现了它的目的。但是我突然想到Kotlin在匹配正则表达式方面做得更好,瞧,解决方案变得简单而优雅,如下所示:

fun isPosOrNegNumber(s: String?) : Boolean {
    val regex = """^(-)?[0-9]{0,}((\.){1}[0-9]{1,}){0,1}$""".toRegex()
    return if (s.isNullOrEmpty()) false 
           else regex.matches(s)
        
}

此示例正则表达式仅适用于美国数字格式,但如果要使用欧盟数字格式,只需将“.”替换为“,”
如果数字包含逗号,那么在发送到这个方法时就替换它,或者更好地形成一个带有逗号的正则表达式模式。

nom7f22z

nom7f22z5#

另一种检查给定字符串是否为数值(检查负值和正值)的方法:

val intChars =  '0'..'9'

fun isNumeric(input: String) = input
    .removePrefix("-")
    .all { it in '0'..'9' }
vkc1a9a2

vkc1a9a26#

一个没有任何自定义函数的简单答案是使用toDoubleOrNull函数。如果它返回null,则字符串不是数字。

val string = "-12345.666"
if (string.toDoubleOrNull()!=null) // string is numeric
{
  //do something
}

如果你知道输入只包含整数,你也可以同样使用toIntOrNull

相关问题