Быстрый способ конвертировать в двойную строку в десятичном формате, не зная, что это за формат - PullRequest
0 голосов
/ 28 марта 2019

У меня есть этот код на языке котлин:

val stringDecimalvalue = ... // can come as '#,###.##' or '#.###,##' and the two are valid

Я хочу создать Double с этим String, таким образом

var monetaryValue = Double(stringDecimalvalue)

Если значение в #, ###. ## формате, то значение NumberFormatException будет увеличено, тогда мне нужно знать этот шаблон, прежде чем форматировать.

Есть способ, которым мне не нужно прокручивать всю строку или применять регулярное выражение с соответствием? (или, может быть, подход легкого регулярного выражения)

Спасибо!

Ответы [ 2 ]

2 голосов
/ 28 марта 2019

мне кажется, что самый простой способ найти последнее появление , или . и удалить все появления . и . до этого, тогда вы сможете использовать Double::parseString

0 голосов
/ 30 марта 2019

Прежде всего, я должен сказать, что нет смысла использовать функцию предложения общего назначения без явного формата, потому что, как и комментарии @gidds и @DodgyCodeException, он подвержен неоднозначности.

Таким образом,Я решил использовать regex для сопоставления разделителя десятичных точек, сгруппированных запятыми [0-9]+(,[0-9]{3})*\\.[0-9]{2}, и инвертированного регистра [0-9]+(\\.[0-9]{3})*,[0-9]{2} (разделителя запятых, сгруппированных по точкам).Затем очистите запятые и замените точки, чтобы получить десятичный формат без группировки точек, который я хочу проанализировать в Double

. Я делаю это так, как extension function:

const val NOTHING = ""
const val COMMA = ","
const val POINT = "."

val commaGrouped = "[0-9]+(,[0-9]{3})*\\.[0-9]{2}".toRegex()
val pointGrouped = "[0-9]+(\\.[0-9]{3})*,[0-9]{2}".toRegex()

fun String.commaCleaned() = replace(COMMA, NOTHING)

fun String.pointCleaned() = replace(POINT, NOTHING)

fun String.commaToPoint() = replace(COMMA, POINT)

fun String.pointToComma() = replace(POINT, COMMA)


fun String.toDouble() =
    when {
        commaGrouped matches this -> Double(commaCleaned())
        pointGrouped matches this -> Double(pointCleaned().commaToPoint())
        else -> throw IllegalArgumentException(
            "the value ${this} can't be converted to ${Double::class.java} " +
                "have match ${commaGrouped.pattern} " +
                "or ${pointGrouped.pattern}")
    }

что целочисленный формат или десятичная точность больше двух не будет соответствовать для создания Double, и это то, что я тоже хочу.

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