从字符串中提取数字 Kotlin

37

String.replaceAll在Kotlin中不可用且不被支持。因此我建议提供一个演示示例,希望它能有所帮助。


var string = "vsdhfnmsdbvfuf121535435aewr"  
string.replace("[^0-9]".toRegex(), "")

字符串中可以包含多个数字(分散在字符串中)还是只能有一个? - Willi Mentzel
我们能帮到您吗? - Willi Mentzel
10个回答

105

如果输入有 . ,那么就输出 ? - Bincy Baby
3
一个简单的单元测试可以帮助你弄清楚如何包含句号:var result = string.filter{ it.isDigit() || it == '.'} - jj.
我喜欢Kotlin可以像这样做的方式。在Char类上使用扩展函数进行此操作对于可读性非常有帮助。 - Vít Kapitola
1
@jj,你不需要那样做,只需将输出除以100,你就可以得到你的小数了。 - Brill Pappin

7
您的代码运行良好。在这里,string是不可变的。因此,它的值不能被更改。但是,您可以将另一个变量分配给替换后的字符串。
fun main(args: Array<String>) {
    var string = "vsdhfnmsdbvfuf121535435aewr"
    var res = string.replace("[^0-9]".toRegex(), "")
    println(res)
}

4
对于一些特殊情况,比如文本中包含格式化的金额数值,那么上述方法可能会失败。例如,如果文本是“Rs. 1,00,000.00”,如果我们只过滤点号数字,那么得到的输出将会是 .100000.00 ,这就是错误的金额数值。因此最好先提取数字之间的字符串,然后再过滤数字和点号。
    fun String.getAmount(): String {
    return substring(indexOfFirst { it.isDigit() }, indexOfLast { it.isDigit() } + 1)
        .filter { it.isDigit() || it == '.' }
    }

以下案例将使用上述代码进行覆盖

  println("Rs. 123".getAmount())
  println("Rs. 123.23".getAmount())
  println("Rs. 123.23/-".getAmount())
  println("INR123.23".getAmount())
  println("123.23INR".getAmount())
  println("$100,000.00".getAmount())
  println("Rs.100,000.00".getAmount())

你的意思是去掉“Rs. 1,00,000.00”会得到10000000而不是100000。但这没关系,因为这是银行家的值,它是以分为单位的,只需除以100,就可以得到100000.00。 - Brill Pappin
@BrillPappin 如果是这种情况,我们该如何处理 Rs. 123 和 Rs. 123.00?我已经解释了正则表达式方法和仅过滤数字方法的局限性。 - Prasad
Rs. 123 是无效的,或者说被视为1.23,但 Rs 123.00 将被视为 12300。这是预期的。如果您正在转换输入,您希望它以这种方式工作。当用户输入时,他们正在添加美分。另一个潜在的用途是解析一堆损坏的数据。在这种情况下,您需要先修复数据。 - Brill Pappin

4

replace 不会改变字符串 str,这就是为什么它适用于不可变的字符串 (val)。

val str = "vsdhfnmsdbvfuf121535435aewr"
val num = str.replace(Regex("[^0-9]"), "")
println(num)

输出:

4545121535435


由于您的问题标题为“数字”:如果您在字符串中散布了多个数字,则可以使用Regex.findAll。 这也是一种更安全的解决方案,因为如果您只删除数字周围的内容,可能会把“a1b2c3”解释为“123”,而不是 “[1, 2, 3]”。

val str = "vsdhfn4545msdbvfuf121535435aewr"
val numbers = Regex("[0-9]+").findAll(str)
        .map(MatchResult::value)
        .toList()

println(numbers)

输出:

[4545,121535435]


3

如果你想要提取数字,这里是解决方案

var string = "vsdhfnmsdbvfuf121535435aewr"
var result = string.filter { it.isLetter() }

不要使用.isdigit,而是使用.isletter,这样就可以正常工作了。


3

replace 方法返回一个新的 String,而不是修改原有字符串。你可以在这里尝试一下,这对你会很有用。

var s1 = "vsdhfnmsdbvfuf121535435aewr"  
var s2 = s1.replace("[^0-9]".toRegex(), "")
print(s2)

1

replace函数不会修改原始字符串,而是返回一个新的字符串。你的代码将正常运行:

  • val result = replace("[^0-9]".toRegex(), "")

0

0
尝试这个例子:

代码

  try {
        val p = Pattern.compile("\\d+")
        var m = p.matcher("string1234more567string890")
         while (m.find()) {
           System.out.println(m.group())
          }
      }catch (ex:java.lang.Exception){
      }

0
尝试这个,我们会得到结果。
val digit:Int = Regex("[^0-9]").replace(bindAyatSearch.ayatSearchSp.selectedItem.toString(), "").toInt()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接