Flutter: TextField з числом із двома символами після крапки
Я свого часу запарився шукати регулярний вираз і от для себе зробив приклад, щоб можна було використовувати в майбутніх та існуючих проектах. Тепер можете собі скопіювати і використовувати. Знаю, що він не ідеальний, проте це краще, аніж городити якісь перевірки. Якщо будуть зміни, то я сюди їх опублікую.
Пояснення:
keyboardType: TextInputType.numberWithOptions(decimal: true): Встановлює тип клавіатури для числового введення з підтримкою десяткової крапки.inputFormatters: [FilteringTextInputFormatter.allow(RegExp(r'^\d*\.?\d{0,2}'))]: ВикористовуєFilteringTextInputFormatterдля фільтрації введеного тексту. Регулярний виразr'^\d*\.?\d{0,2}'дозволяє вводити тільки цифри, одну крапку та максимум два знаки після крапки. Це запобігає введенню неправильних символів.
В регулярних виразах символ $ є якорем, який відповідає кінцю рядка. Це означає, що він не відповідає жодному конкретному символу, а лише позиції в кінці рядка. Вираз з $ буде відповідати лише тоді, коли шаблон, який йому передує, знаходиться саме в кінці рядка.
Наприклад:
hello$відповідатиме рядку «hello», але не «hello world».\d+$відповідатиме рядку «123», але не «123abc».
$ корисний для перевірки того, чи закінчується рядок певним шаблоном. Він часто використовується в поєднанні з іншими елементами регулярних виразів для створення складніших умов відповідності.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
Expanded( flex: 1, child: TextField( onSubmitted: (e) { textFieldSumPaymentController.text = doubleToString(widget.orderCustomer.sumPayment); }, onChanged: (e) { setState(() { try { if (e.isNotEmpty) { widget.orderCustomer.sumPayment = double.parse(e); } else { widget.orderCustomer.sumPayment = 0.0; } } catch (e) { widget.orderCustomer.sumPayment = 0.0; } }); }, keyboardType: const TextInputType.numberWithOptions(decimal: true), inputFormatters: [FilteringTextInputFormatter.allow(RegExp(r'^\d*\.?\d{0,2}$'))], controller: textFieldSumPaymentController, decoration: const InputDecoration( contentPadding: EdgeInsets.fromLTRB(10, 0, 10, 0), border: OutlineInputBorder(), labelStyle: TextStyle( color: Colors.blueGrey, ), labelText: 'Сума планової оплати', ), ), ) |

