How to Allow Only Two Decimal Number In Flutter ?
TextField Widget is used to get data from users and perform the desired operation. So in this article, We will go through How to Allow Only Two Decimal Number In Flutter?
Are you ready for the same?
Get Set and Go…
How to Allow Only Two Decimal Number In Flutter?
Users can give a try to below code snippet.
import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'dart:math' as math; void main() { runApp(new MaterialApp(home: new MyApp())); } class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Flutter"), ), body: Form( child: ListView( children: <Widget>[ TextFormField( inputFormatters: [DecimalTextInputFormatter(decimalRange: 2)], keyboardType: TextInputType.numberWithOptions(decimal: true), ) ], ), ), ); } } class DecimalTextInputFormatter extends TextInputFormatter { DecimalTextInputFormatter({this.decimalRange}) : assert(decimalRange == null || decimalRange > 0); final int decimalRange; @override TextEditingValue formatEditUpdate( TextEditingValue oldValue, // unused. TextEditingValue newValue, ) { TextSelection newSelection = newValue.selection; String truncated = newValue.text; if (decimalRange != null) { String value = newValue.text; if (value.contains(".") && value.substring(value.indexOf(".") + 1).length > decimalRange) { truncated = oldValue.text; newSelection = oldValue.selection; } else if (value == ".") { truncated = "0."; newSelection = newValue.selection.copyWith( baseOffset: math.min(truncated.length, truncated.length + 1), extentOffset: math.min(truncated.length, truncated.length + 1), ); } return TextEditingValue( text: truncated, selection: newSelection, composing: TextRange.empty, ); } return newValue; } }
The solution will work like this
TextFormField( inputFormatters: [ WhitelistingTextInputFormatter(RegExp(r'^\d+\.?\d{0,2}')), ], )
A Shorter Version of DecimalTextInputFormatter using RegExp:
class DecimalTextInputFormatter extends TextInputFormatter { DecimalTextInputFormatter({int decimalRange, bool activatedNegativeValues}) : assert(decimalRange == null || decimalRange >= 0, 'DecimalTextInputFormatter declaretion error') { String dp = (decimalRange != null && decimalRange > 0) ? "([.][0-9]{0,$decimalRange}){0,1}" : ""; String num = "[0-9]*$dp"; if(activatedNegativeValues) { _exp = new RegExp("^((((-){0,1})|((-){0,1}[0-9]$num))){0,1}\$"); } else { _exp = new RegExp("^($num){0,1}\$"); } } RegExp _exp; @override TextEditingValue formatEditUpdate( TextEditingValue oldValue, TextEditingValue newValue, ) { if(_exp.hasMatch(newValue.text)){ return newValue; } return oldValue; } }
TextFormField( inputFormatters: [ WhitelistingTextInputFormatter(RegExp(r'^(\d+)?\.?\d{0,2}')), ], )
import 'package:flutter/services.dart'; import 'dart:math' as math; class DecimalTextInputFormatter extends TextInputFormatter { DecimalTextInputFormatter({this.decimalRange, this.activatedNegativeValues}) : assert(decimalRange == null || decimalRange >= 0, 'DecimalTextInputFormatter declaretion error'); final int decimalRange; final bool activatedNegativeValues; @override TextEditingValue formatEditUpdate( TextEditingValue oldValue, // unused. TextEditingValue newValue, ) { TextSelection newSelection = newValue.selection; String truncated = newValue.text; if (newValue.text.contains(' ')) { return oldValue; } if (newValue.text.isEmpty) { return newValue; } else if (double.tryParse(newValue.text) == null && !(newValue.text.length == 1 && (activatedNegativeValues == true || activatedNegativeValues == null) && newValue.text == '-')) { return oldValue; } if (activatedNegativeValues == false && double.tryParse(newValue.text) < 0) { return oldValue; } if (decimalRange != null) { String value = newValue.text; if (decimalRange == 0 && value.contains(".")) { truncated = oldValue.text; newSelection = oldValue.selection; } if (value.contains(".") && value.substring(value.indexOf(".") + 1).length > decimalRange) { truncated = oldValue.text; newSelection = oldValue.selection; } else if (value == ".") { truncated = "0."; newSelection = newValue.selection.copyWith( baseOffset: math.min(truncated.length, truncated.length + 1), extentOffset: math.min(truncated.length, truncated.length + 1), ); } return TextEditingValue( text: truncated, selection: newSelection, composing: TextRange.empty, ); } return newValue; } }
Conclusion:
Hope you guys are enjoying our articles based on Flutter.
Do share your valuable feedback/suggestion for the same.
Keep Learning !!! Keep Fluttering !!!
FlutterAgency.com is our portal Platform dedicated to Flutter Technology and Flutter Developers. The portal is full of cool resources from Flutter like Flutter Widget Guide, Flutter Projects, Code libs and etc.
FlutterAgency.com is one of the most popular online portal dedicated to Flutter Technology and daily thousands of unique visitors come to this portal to enhance their knowledge on Flutter.
Contemporary ventures
Recent blog
ready to get started?
Fill out the form below and we will be in touch soon!
"*" indicates required fields