Форматирование валюты в текстовых полях Flutter: подробное руководство

При разработке мобильных приложений с помощью Flutter одним из распространенных требований является форматирование текстовых полей для отображения значений денежных единиц. Форматирование валюты помогает улучшить взаимодействие с пользователем, предоставляя знакомое и легко читаемое представление денежных значений. В этой статье мы рассмотрим несколько методов форматирования валюты во Flutter TextFields, дополненные примерами кода и разговорными объяснениями.

Метод 1: использование пакета intl
Один из самых популярных и универсальных способов форматирования валюты во Flutter — использование пакета intl. Этот пакет предоставляет набор мощных инструментов локализации и интернационализации, включая форматирование валют. Вот пример того, как его использовать:

import 'package:intl/intl.dart';
// Inside your TextField widget
TextEditingController _controller = TextEditingController();
TextField(
  controller: _controller,
  keyboardType: TextInputType.number,
  inputFormatters: [
    FilteringTextInputFormatter.allow(RegExp(r'^\d+\.?\d{0,2}')),
    CurrencyInputFormatter()
  ],
);
class CurrencyInputFormatter extends TextInputFormatter {
  TextEditingValue formatEditUpdate(
      TextEditingValue oldValue, TextEditingValue newValue) {
    if (newValue.selection.baseOffset == 0) {
      return newValue;
    }
    double value = double.parse(newValue.text);
    final formatter = NumberFormat.currency(
      locale: 'en_US',
      symbol: '\$',
      decimalDigits: 2,
    );
    String newText = formatter.format(value / 100);
    return newValue.copyWith(
      text: newText,
      selection: TextSelection.collapsed(offset: newText.length),
    );
  }
}

Метод 2: пользовательская функция форматирования
Если вы предпочитаете более индивидуальный подход, вы можете реализовать собственную функцию форматирования. Это позволяет вам иметь детальный контроль над форматом валюты. Вот пример:

TextEditingController _controller = TextEditingController();
TextField(
  controller: _controller,
  keyboardType: TextInputType.number,
  onChanged: (value) {
    String formattedValue = formatCurrency(value);
    _controller.text = formattedValue;
    _controller.selection = TextSelection.fromPosition(
      TextPosition(offset: formattedValue.length),
    );
  },
);
String formatCurrency(String value) {
  int intValue = int.tryParse(value.replaceAll(',', '')) ?? 0;
  String formattedValue = NumberFormat.currency(
    locale: 'en_US',
    symbol: '\$',
    decimalDigits: 2,
  ).format(intValue / 100);
  return formattedValue;
}

Метод 3: пакет FlutterMoneyFormatter
Еще один полезный пакет для форматирования валюты во Flutter — flutter_money_formatter. Он предлагает простой и интуитивно понятный API для форматирования значений валюты. Вот пример:

import 'package:flutter_money_formatter/flutter_money_formatter.dart';
TextEditingController _controller = TextEditingController();
TextField(
  controller: _controller,
  keyboardType: TextInputType.number,
  onChanged: (value) {
    FlutterMoneyFormatter fmf = FlutterMoneyFormatter(
      amount: double.parse(value),
      settings: MoneyFormatterSettings(
        symbol: '\$',
        thousandSeparator: ',',
        decimalSeparator: '.',
        symbolAndNumberSeparator: ' ',
        fractionDigits: 2,
      ),
    );
    _controller.text = fmf.output.symbolOnLeft;
    _controller.selection = TextSelection.fromPosition(
      TextPosition(offset: fmf.output.symbolOnLeft.length),
    );
  },
);

В этой статье мы рассмотрели три различных метода форматирования валюты во Flutter TextFields. Первый метод использует пакет intl, предлагающий мощные инструменты локализации и интернационализации. Второй метод демонстрирует пользовательскую функцию форматирования, обеспечивающую гибкость и контроль над форматом валюты. Наконец, третий метод представил пакет flutter_money_formatter, который упрощает форматирование валюты с помощью интуитивно понятного API. Используя эти методы, вы можете улучшить свои приложения Flutter, представляя значения валют в удобном и знакомом формате.