我需要将给定字符串中的分数替换为十进制。 因此:
1/4 xx -> 0.25 xx
1/3 xx -> 0.33 xx
在我身上覆盖了以下的pelpels:
private fun String.replaceFractions() = "(?:[1-9]*)/[1-9]*".toRegex().find(this)
?.let {
val fraction = it.groups[0]!!.value
val fractionParts = fraction.split("/")
.map { part -> part.toDouble() }
this.replace(fraction, (fractionParts[0] / fractionParts[1]).toString())
}
?: this
但是当它们也包含整个部分时,我找不到正确替换字符串的方法:
1 1/4 xx -> 1.25 xx
3 3/5 xx -> 3.6 xx
答案 0 :(得分:1)
仅用replace
就可以实现您想要的
val s = "Some text: 1/4 and 3 3/5"
val result = s.replace("""(?:(\d+(?:\.\d+)?)\s+)?(\d+)/(\d+)""".toRegex()) {
((if (it.groupValues[1].isNullOrEmpty()) 0.0 else it.groupValues[1].toDouble()) + (it.groupValues[2].toDouble() / it.groupValues[3].toDouble())).toString()
}
println(result) // => Some text: 0.25 and 3.6
请参见Kotlin demo
正则表达式详细信息
(?:(\d+(?:\.\d+)?)\s+)?
-一个可选的非捕获组,匹配以下情况的1或0:
(\d+(?:\.\d+)?)
-第1组:1个以上的数字,然后是.
和1个以上的数字的1或0(可选)序列\s+
-超过1个空格(\d+)
-第2组:1个以上数字/
-一个/
字符(\d+)
-第3组:1个以上数字如果第1组匹配,则将其值强制转换为两倍,否则,将使用0
,并将该值与第2组和第3组除法的结果相加。