Задать вопрос
Davidaa_WoW
@Davidaa_WoW

Как форматировать TextField под ввод чисел?

Нужно форматировать ввод пользователя в вид: "x,xxx.xx", ну и соответственно каждые 3 новых порядка также ставить запятую, при этом после точки должно быть фиксировано 2 знака.
Для расстановки запятых у меня есть контроллер:
myController.addListener(() {
			String text = (myController.text).replaceAllMapped(RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))'), (Match m) => '${m[1]},');
      myController.value = myController.value.copyWith(
        text: text,
        selection:
            TextSelection(baseOffset: text.length, extentOffset: text.length),
        composing: TextRange.empty,
      );
    });

TextField(
                        controller: myController,
),


Для предотвращения ввода букв у меня есть inputFormatter. Через него же пытаюсь предотвратить ввод двух точек подряд и более двух цифр после точки:

inputFormatters:[
      FilteringTextInputFormatter.allow(RegExp("[0-9.]")),
      FilteringTextInputFormatter.deny(RegExp(r"\.\.")),
      FilteringTextInputFormatter.deny(RegExp(r"\....")),
  ],

Оно конечно работает, да вот проблема в том, что оно всё удаляет. То есть если после точки попытаться ввести вторую точку, то она также удалится, тоже самое произойдёт и если попытаться ввести третью цифру после точки. Что с этим делать? И если с двумя точками я могу попытаться заменять через replacementString на точку, то как поступать с цифрами не совсем понятно.
  • Вопрос задан
  • 274 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Neonoviiwolf
Flutter developer
вот так я форматирую номер телефона, где-то нагуглил пример похожий, по аналогии вам делать
class RuNumberTextInputFormatter extends TextInputFormatter {
  @override
  TextEditingValue formatEditUpdate(
    TextEditingValue oldValue,
    TextEditingValue newValue,
  ) {
    final int newTextLength = newValue.text.length;
    int selectionIndex = newValue.selection.end;
    int usedSubstringIndex = 0;
    final StringBuffer newText = StringBuffer();

    if (newTextLength >= 1) {
      newText.write('(');
      if (newValue.selection.end >= 1) selectionIndex++;
    }

    if (newTextLength >= 4) {
      newText.write('${newValue.text.substring(0, usedSubstringIndex = 3)}) ');
      if (newValue.selection.end >= 3) selectionIndex += 2;
    }

    if (newTextLength >= 7) {
      newText.write('${newValue.text.substring(3, usedSubstringIndex = 6)}-');
      if (newValue.selection.end >= 6) selectionIndex++;
    }

    if (newTextLength >= 9) {
      newText.write('${newValue.text.substring(6, usedSubstringIndex = 8)}-');
      if (newValue.selection.end >= 8) selectionIndex++;
    }

    if (newTextLength >= usedSubstringIndex) {
      newText.write(newValue.text.substring(usedSubstringIndex));
    }

    if (newTextLength > 10) {
      return TextEditingValue(
        text: oldValue.text,
        selection: TextSelection.collapsed(offset: oldValue.text.length),
      );
    }

    return TextEditingValue(
      text: newText.toString(),
      selection: TextSelection.collapsed(offset: selectionIndex),
    );
  }
}


62973988bf2bc724814842.png
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы