Заменить дроби на десятичные дроби в строке - PullRequest
1 голос
/ 14 июня 2019

Мне нужно заменить дробь в данной строке на десятичную. Итак:

1/4 xx -> 0.25 xx
1/3 xx -> 0.33 xx

Над экзаменами, на которые я попал:

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 Ответ

1 голос
/ 14 июня 2019

Вы можете достичь того, что вы хотите, просто 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

Regex details

  • (?:(\d+(?:\.\d+)?)\s+)? - необязательная группа без захвата, соответствующая 1 или 0 вхождениям:
    • (\d+(?:\.\d+)?) - группа 1: 1+ цифр, а затем 1 или 0 (необязательно) последовательность. и 1+ цифр
    • \s+ - 1+ пробелы
    • (\d+) - Группа 2: 1+ цифры
  • / - / char
  • (\d+) - Группа 3: 1+ цифр

Если группа 1 соответствует, ее значение приводится к удвоению, иначе, 0берется, и значение суммируется с результатом деления на Группу 2 и Группу 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...