如何在kotlin中使用点和逗号分隔数字

问题描述 投票:0回答:1

我正在尝试实现一个带有逗号和点的文本观察器,但我找不到解决方案。如果用户输入 10000,我需要在我的编辑文本中将其显示为 10.000,如果用户想要添加便士,则需要在逗号之后显示为 10.000,50,最多允许 2 位数字,这是我尝试做的事情。我怎样才能做到这一点?有人可以帮助我吗?

 et_cekme_tutari.addTextChangedListener(object : TextWatcher {
        override fun afterTextChanged(p0: Editable?) {
            et_cekme_tutari.removeTextChangedListener(this)
            try {
                var givenstring: String = p0.toString()
                if (givenstring.contains(thousandSeparator)) {
                    givenstring = givenstring.replace(thousandSeparator.toString(), "")
                }
                val containsDotAndComma = givenstring.contains('.') && givenstring.contains(',')

           
                if (containsDotAndComma) {
                    givenstring = givenstring.replace(".", "")
                }

           
                givenstring = givenstring.replace(",", ".")

                val doubleVal: Double = givenstring.toDouble()

                val unusualSymbols = DecimalFormatSymbols()
                unusualSymbols.decimalSeparator = decimalSeparator
                unusualSymbols.groupingSeparator = thousandSeparator

                val formatter = DecimalFormat("#,##0.##", unusualSymbols)
                formatter.groupingSize = 3
                val formattedString = formatter.format(doubleVal)

                et_cekme_tutari.setText(formattedString)
                et_cekme_tutari.setSelection(et_cekme_tutari.text.length)
            } catch (nfe: NumberFormatException) {
                nfe.printStackTrace()
            } catch (e: Exception) {
                e.printStackTrace()
            }

            et_cekme_tutari.addTextChangedListener(this)
        }

        override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
        }

        override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
        }

    })

private var decimalSeparator: Char = ','
private var thousandSeparator: Char = '.'

fun setDecimalSeparator(decimalSeparator: Char) {
    this.decimalSeparator = decimalSeparator
}

fun setThousandSeparator(thousandSeparator: Char) {
    this.thousandSeparator = thousandSeparator
}
kotlin android-edittext android-textwatcher
1个回答
0
投票

我会尝试这样的事情......

class NumberTextWatcher(private val editText: EditText) : TextWatcher {

    private val decimalFormat: DecimalFormat
    private var isEditing: Boolean = false

    init {
        val symbols = DecimalFormatSymbols(Locale.getDefault()).apply {
            groupingSeparator = '.'
            decimalSeparator = ','
        }
        decimalFormat = DecimalFormat("#,##0.##", symbols).apply {
            isDecimalSeparatorAlwaysShown = false
            isGroupingUsed = true
        }
    }

    …

    override fun afterTextChanged(ed: Editable?) {
        if (isEditing || ed == null) return
        isEditing = true

        try {
            val originalStr = ed.toString()
            val cleanString = originalStr.replace(".", "").replace(",", "")
            if (cleanString.isNotEmpty()) {
                val parsed = cleanString.toDouble()
                val formatted = decimalFormat.format(parsed / 100) // Assuming input needs to be divided by 100
                ed.replace(0, ed.length, formatted)

                // Attempt to maintain cursor position
                editText.setSelection(minOf(formatted.length, editText.selectionStart))
            }
        } catch (e: NumberFormatException) {
            ed.clear()
        }

        isEditing = false
    }
}

甚至可以使用

BigDecimal
代替
Double
并调整
Locale
...

© www.soinside.com 2019 - 2024. All rights reserved.