将分数替换为字符串中的小数

时间:2019-06-14 10:46:20

标签: regex kotlin

我需要将给定字符串中的分数替换为十进制。 因此:

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

1 个答案:

答案 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组除法的结果相加。