如何使用Kotlin何时查找字符串是否为数字?

uzi*_*lan 7 kotlin

我想when()在Kotlin中使用一个表达式来从函数中返回不同的值.输入是a String,但它可能是可解析的Int,所以我想Int在可能的情况下返回解析,或者String如果不是,则返回.由于输入是一个String我不能使用是类型检查表达式.

有没有惯用的方法来实现这一目标?

编辑:我的问题是when()表达式应该是什么样子,而不是关于返回类型.

Wil*_*zel 14

版本1(使用toIntOrNullwhen按要求时)

fun String.intOrString(): Any {
    val v = toIntOrNull()
    return when(v) {
        null -> this
        else -> v
    }
}

"4".intOrString() // 4
"x".intOrString() // x
Run Code Online (Sandbox Code Playgroud)

版本2(使用toIntOrNull和elvis运算符?:)

正如s1m0nw1的评论中所建议的那样:when实际上并不是处理这个问题的最佳方法,我只是when因为你明确要求它而使用.这样更合适:

fun String.intOrString() = toIntOrNull() ?: this
Run Code Online (Sandbox Code Playgroud)

版本3(使用异常处理):

fun String.intOrString() = try { // returns Any
   toInt()
} catch(e: NumberFormatException) {
   this
}
Run Code Online (Sandbox Code Playgroud)

  • 还有“toLongOrNull”、“toDoubleOrNull”。 (3认同)

小智 9

使用 let 为一

fun isInteger(str: String?) = str?.toIntOrNull()?.let { true } ?: false
Run Code Online (Sandbox Code Playgroud)

  • @plinh fun isInteger(str: String?) = str?.toIntOrNull() != null (8认同)
  • 即使这是正确的答案,解释为什么这是要遵循的答案也是一种普遍的良好行为。 (2认同)
  • 这是正确的,但您必须确保您正在使用的数字不大于 Integer,否则将返回 false,因为即使它是数字,它也无法将其转换为 Int。要检查字符串是否为数字,您应该使用 Long 或 Double 以使该函数在更多情况下工作。 (2认同)

Har*_*436 8

简单直观

fun isNumeric(str: String) = str.all { it in '0'..'9' }
Run Code Online (Sandbox Code Playgroud)

正如 @coolMind 指出的,如果你想过滤 +/-

fun isNumeric(str: String): Boolean = str
        .removePrefix("-")
        .removePrefix("+")
        .all { it in '0'..'9' }
Run Code Online (Sandbox Code Playgroud)

性能会类似


rdu*_*and 6

包中的toIntOrNull函数kotlin.text(in kotlin-stdlib)可能就是你要找的东西:

toIntOrNull

fun String.toIntOrNull(): Int? (source)
Run Code Online (Sandbox Code Playgroud)

平台和版本要求:Kotlin 1.1

将字符串解析为Int数并返回结果,如果字符串不是数字的有效表示,则返回null.

fun String.toIntOrNull(radix: Int): Int? (source)
Run Code Online (Sandbox Code Playgroud)

平台和版本要求:Kotlin 1.1

将字符串解析为Int数并返回结果,如果字符串不是数字的有效表示,则返回null.

更多信息:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/to-int-or-null.html