Après trop de recherches et d'échecs avec les Doubles, BigDecimals et ainsi de suite, j'ai fait ce code. Il fonctionne plug And Play. Son en kotlin. Donc, pour aider les autres bloqués comme moi, allons-y.
Le code est essentiellement une fonction qui placera un textWatcher et ajustera la virgule à la bonne place.
Tout d'abord, créez cette fonction :
fun CurrencyWatcher( editText:EditText) {
editText.addTextChangedListener(object : TextWatcher {
//cela empêchera la boucle
var changed: Boolean = false
override fun afterTextChanged(p0: Editable?) {
changed = false
}
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
editText.setSelection(p0.toString().length)
}
@SuppressLint("SetTextI18n")
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
if (!changed) {
changed = true
var str: String = p0.toString().replace(",", "").trim()
var element0: String = str.elementAt(0).toString()
var element1: String = "x"
var element2: String = "x"
var element3: String = "x"
var element4: String = "x"
var element5: String = "x"
var element6: String = "x"
//ces variables stockeront chaque élément des données initiales dans le cas où nous devons déplacer ces nombres comme : 0,01 à 0,11 ou 0,11 à 0,01
if (str.length >= 2) {
element1 = str.elementAt(1).toString()
}
if (str.length >= 3) {
element2 = str.elementAt(2).toString()
}
editText.removeTextChangedListener(this)
//ce premier bloc de code s'occupera du cas
//où le nombre commence par 0 et doit ajuster le 0 et la virgule
if (str.length == 1) {
str = "0,0" + str
editText.setText(str)
} else if (str.length <= 3 && str == "00") {
str = "0,00"
editText.setText(str)
editText.setSelection(str.length)
} else if (element0 == "0" && element1 == "0" && element2 == "0") {
str = str.replace("000", "")
str = "0,0" + str
editText.setText(str)
} else if (element0 == "0" && element1 == "0" && element2 != "0") {
str = str.replace("00", "")
str = "0," + str
editText.setText(str)
} else {
//Ce bloc de code fonctionne avec les cas où nous devons déplacer la virgule uniquement car la valeur est plus grande
//obtenons les autres éléments
if (str.length >= 4) {
element3 = str.elementAt(3).toString()
}
if (str.length >= 5) {
element4 = str.elementAt(4).toString()
}
if (str.length >= 6) {
element5 = str.elementAt(5).toString()
}
if (str.length == 7) {
element6 = str.elementAt(6).toString()
}
if (str.length >= 4 && element0 != "0") {
val sb: StringBuilder = StringBuilder(str)
//placez la virgule à la bonne place
sb.insert(str.length - 2, ",")
str = sb.toString()
}
//change le 0,11 en 1,11
if (str.length == 4 && element0 == "0") {
val sb: StringBuilder = StringBuilder(str)
//enlève le 0 initial
sb.deleteCharAt(0);
str = sb.toString()
val sb2: StringBuilder = StringBuilder(str)
sb2.insert(str.length - 2, ",")
str = sb2.toString()
}
//cela se produira quand c'est comme 11,11 et que l'utilisateur en supprime un, donc ce sera maintenant 1,11
if (str.length == 3 && element0 != "0") {
val sb: StringBuilder = StringBuilder(str)
sb.insert(str.length - 2, ",")
str = sb.toString()
}
//se produit lorsque c'est comme 0,11 et que l'utilisateur en supprime un, la sortie sera 0,01
if (str.length == 2 && element0 == "0") {
val sb: StringBuilder = StringBuilder(str)
//prend 0
sb.deleteCharAt(0);
str = sb.toString()
str = "0,0" + str
}
//se produit lorsque c'est 1,11 et que l'utilisateur supprime, la sortie sera 0,11
if (str.length == 2 && element0 != "0") {
val sb: StringBuilder = StringBuilder(str)
//enlève le 0 initial
sb.insert(0, "0,")
str = sb.toString()
}
editText.setText(str)
}
//place le sélecteur à la fin pour augmenter le nombre
editText.setSelection(str.length)
editText.addTextChangedListener(this)
}
}
})
}
Ensuite, vous appelez cette fonction de cette manière
val etVal:EditText = findViewById(R.id.etValue)
CurrencyWatcher(etVal)