Фильтр Tornadofx Вход - PullRequest
       2

Фильтр Tornadofx Вход

0 голосов
/ 03 августа 2020

Я хотел бы сделать специальный формат текстового поля для преобразования в двойные. Однако я хочу использовать запятую для десятичного разделения вместо точек. Я занимался исследованием в течение нескольких дней и просмотрел руководство, но у меня все еще возникают проблемы. isDouble похоже, не работает при использовании запятых. Даже если я использовал точки, данные форматируются неправильно при обратной записи (т.е. текстовое поле 12.13 становится в базе данных 1213.00). Вот что у меня есть на данный момент:

val format = DecimalFormat("##0.00", DecimalFormatSymbols(Locale.GERMAN))

                        textfield(model.size, converter = object : StringConverter<Number>() {
                            override fun toString(number: Number?) = format.format(number)
                            override fun fromString(string: String?) = try {
                            format.parse(string).toDouble() } 
                            catch (e: ParseException) {0.0}
                        }){
                        filterInput {
                            val ba = mutableListOf<Boolean>().asObservable()
                            it.controlNewText.toCharArray().forEach { char ->
                                when {
                                    char.isDigit() -> ba.add(true)
                                    char == ',' -> ba.add(true)
                                    else -> ba.add(false)
                                }
                            }
                            when{
                                ba.any{false} -> return@filterInput false
                                else ->  return@filterInput true
                            } 
                        }}

1 Ответ

0 голосов
/ 04 августа 2020

Это сработает? Я знаю, что цикл старой школы и использование переменных (Гросс!) - не самый крутой способ справиться с ситуацией, но вычисления относительно небольшие и их легко понять.

filterInput {
                var decimalUsed = false
                loop@ for (char in it.controlNewText) {
                    if (char == ',') {
                        if (decimalUsed) {
                            return@filterInput false
                        } else {
                            decimalUsed = true
                        }
                    } else if (!char.isDigit()) {
                        return@filterInput false
                    }
                }
                true
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...