Allow only two decimal number in flutter input?

后端 未结 9 1238
误落风尘
误落风尘 2020-12-30 07:03

I want only two digits after decimal point in the flutter input.User can\'t add more than two digits after decimal point.

相关标签:
9条回答
  • 2020-12-30 07:32

    Here you go! Hope it helps :)

    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;
      }
    }
    
    0 讨论(0)
  • 2020-12-30 07:34

    May be this is a simpler solution

    inputFormatters: [
                FilteringTextInputFormatter.allow(RegExp(r'(^\d*\.?\d{0,2})'))
              ]
    
    0 讨论(0)
  • 2020-12-30 07:39

    Here is a solution which works for me

    TextFormField(
        inputFormatters: [
            WhitelistingTextInputFormatter(RegExp(r'^\d+\.?\d{0,2}')),
        ],
    )
    

    If you want to allow input like (.21) or (.25)

    Here is a solution-

    TextFormField(
        inputFormatters: [
            WhitelistingTextInputFormatter(RegExp(r'^(\d+)?\.?\d{0,2}')),
        ],
    )
    
    0 讨论(0)
提交回复
热议问题