Dart 具有货币格式的flift文本字段

Dart 具有货币格式的flift文本字段,dart,flutter,Dart,Flutter,有一种方法可以在文本字段中设置货币格式,当用户要输入它已经实时格式化的值时 如上图所示,当用户键入格式时,将更新已格式化的值 [更新] 我刚刚发现了这个库,它让它像一个魅力: [此代码并不适用于所有情况] 我就是这样做的,以防有人也需要: 文本字段 TextFormField( //validator: , controller: controllerValor, inputFormatters: [ WhitelistingTextIn

有一种方法可以在文本字段中设置货币格式,当用户要输入它已经实时格式化的值时

如上图所示,当用户键入格式时,将更新已格式化的值

[更新]


我刚刚发现了这个库,它让它像一个魅力:

[此代码并不适用于所有情况]

我就是这样做的,以防有人也需要:

文本字段

TextFormField(  
    //validator: ,  
    controller: controllerValor,  
    inputFormatters: [  
        WhitelistingTextInputFormatter.digitsOnly,
        // Fit the validating format.
        //fazer o formater para dinheiro
        CurrencyInputFormatter()
    ],
    keyboardType: TextInputType.number, ...  
文本输入格式化程序

class CurrencyInputFormatter extends TextInputFormatter {

    TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {

        if(newValue.selection.baseOffset == 0){
            print(true);
            return newValue;
        }

        double value = double.parse(newValue.text);

        final formatter = NumberFormat.simpleCurrency(locale: "pt_Br");

        String newText = formatter.format(value/100);

        return newValue.copyWith(
            text: newText,
            selection: new TextSelection.collapsed(offset: newText.length));
    }
}
这是代码的结果:


设置自定义货币掩码的一个简单解决方案是使用以下软件包:

1-首先,您需要将此包添加到包的pubspec.yaml文件中:

dependencies:
  flutter_masked_text: ^0.7.0
2-之后,使用命令行(如下所示)安装软件包,或者使用图形界面安装软件包,如果您使用IntelliJ IDEA,只需单击“软件包获取”按钮即可

3-现在在您的Dart代码中,导入它

import 'package:flutter_masked_text/flutter_masked_text.dart';
4-最后,将TextField控制器代码从“TextEditingController”更改为“MoneyMaskedTextController”:


更新了@AndréLuis的代码以限制位数(maxDigits),感谢分享

import 'package:flutter/services.dart';
import 'package:intl/intl.dart';

class CurrencyPtBrInputFormatter extends TextInputFormatter {
  CurrencyPtBrInputFormatter({this.maxDigits});
  final int maxDigits;

  TextEditingValue formatEditUpdate(
      TextEditingValue oldValue, TextEditingValue newValue) {

    if (newValue.selection.baseOffset == 0) {
      return newValue;
    }

    if (maxDigits != null && newValue.selection.baseOffset > maxDigits) {
      return oldValue;
    }

    double value = double.parse(newValue.text);
    final formatter = new NumberFormat("#,##0.00", "pt_BR");
    String newText = "R\$ " + formatter.format(value / 100);
    return newValue.copyWith(
        text: newText,
        selection: new TextSelection.collapsed(offset: newText.length));
  }
}
对TextFormField使用下面的代码,我还将值解析为double,使用RegExp删除非数字字符

TextFormField(
  maxLines: 1,
  keyboardType: TextInputType.number,
  inputFormatters: [
    WhitelistingTextInputFormatter.digitsOnly,
    CurrencyPtBrInputFormatter(maxDigits: 8),
  ],
  onSaved: (value) {
    String _onlyDigits = value.replaceAll(RegExp('[^0-9]'), "");
    double _doubleValue = double.parse(_onlyDigits) / 100;
    return _valor = _doubleValue;
  },
);


使用软件包。完整代码:

import'包:intl/intl.dart';
类_HomePageState扩展状态{
最终_controller=TextEditingController();
静态常量_locale='en';
字符串_formatNumber(字符串s)=>NumberFormat.decimalPattern(_locale.format)(int.parse(s));
字符串get _currency=>NumberFormat.compactSimpleCurrency(语言环境:_语言环境).currencySymbol;
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:TextField(
控制器:_控制器,
装饰:输入装饰(前缀:_货币),
键盘类型:TextInputType.number,
onChanged:(字符串){
字符串=“${u formatNumber(string.replaceAll(',',''))}”;
_controller.value=文本编辑值(
文本:字符串,
选择:TextSelection.collapsed(偏移量:string.length),
);
},
),
);
}
}

要使代码更清晰,umasked值可以作为方法包含在Formatter类中。因此,当值被更改时,您将能够调用它并简化代码

Widget build(BuildContext context) {
    var maskFormatter = new CurrencyPtBrFormatter(maxDigits: 12);
    return Scaffold(
        body: SingleChildScrollView(
            controller: _scrollController,
            child: Column(
              children: <Widget>[
                TextField(
                  keyboardType: TextInputType.number,
                  inputFormatters: [
                    WhitelistingTextInputFormatter.digitsOnly,
                    maskFormatter,
                  ],
                  controller: _yourController,
                  onChanged: (value) {
                    print(maskFormatter.getUnmaskedDouble()); // here the umasked value
                  },
                  onEditingComplete: () {
                    mudarFocoCampo(context, _estoqueFocus, _codigoFocus);
                  },
                )
              ],
            )));
  }

这个图书馆非常适合我:



请添加更多详细信息。格式化的结果应该是什么样子?“货币形式”对你意味着什么?你好。你能分享一下你如何实现日期输入逻辑的代码吗Kevin,这个输入格式的代码不是在android normal sdk中。我刚刚发现这个库,它工作起来很有魅力:这个包可能会帮助你你好,类NumberFormat()来自哪里?你好,它来自这个库Hello@Jorgeveira,代码可以工作,但有一个小问题,零的输入不起作用。e、 g.我无法键入数字“500”,最后两个零无法输入。注意
TextInputFormatter
来自
import'程序包:flift/services.dart'它非常有用,您可以用其他方式使用。我用它来格式化不同类型的字段。是的,@Fellipe Sanches,正如我在顶部所说的那样,这会更好,我会标记你的回复,谢谢。包有问题,光标四处跳跃,在某些设备上退格不起作用。我也有MoneyMaskedTextController的问题,每当我键入光标时,它就会跳到字段的开头。有什么办法解决这个问题吗?
final rendaMensalController=MoneyMaskedTextController(小数点分隔符:'',千位分隔符:'','左符号:'R\$)
在左侧显示硬币类型。如何删除小数点?示例:我的号码:2345,我想显示你救了我的2.345。在将onChanged调用中的字符串直接分配给control.text时,我遇到了一个问题。。这将冻结文本字段开头的光标路径。。因此,将插补文本写反。。我还使用controller.text.length来偏移选择,而不是onChanged字符串。非常感谢。如何用点更改逗号?@Rohmataully逗号通常来自
compactSimpleCurrency
,如果您的区域设置允许使用点,它将自动添加。这对整数很有效,但对十进制值无效,例如:1234.90。它导致文本字段在1234处停止。这种情况有解决办法吗?
TextFormField(
  maxLines: 1,
  keyboardType: TextInputType.number,
  inputFormatters: [
    WhitelistingTextInputFormatter.digitsOnly,
    CurrencyPtBrInputFormatter(maxDigits: 8),
  ],
  onSaved: (value) {
    String _onlyDigits = value.replaceAll(RegExp('[^0-9]'), "");
    double _doubleValue = double.parse(_onlyDigits) / 100;
    return _valor = _doubleValue;
  },
);
Widget build(BuildContext context) {
    var maskFormatter = new CurrencyPtBrFormatter(maxDigits: 12);
    return Scaffold(
        body: SingleChildScrollView(
            controller: _scrollController,
            child: Column(
              children: <Widget>[
                TextField(
                  keyboardType: TextInputType.number,
                  inputFormatters: [
                    WhitelistingTextInputFormatter.digitsOnly,
                    maskFormatter,
                  ],
                  controller: _yourController,
                  onChanged: (value) {
                    print(maskFormatter.getUnmaskedDouble()); // here the umasked value
                  },
                  onEditingComplete: () {
                    mudarFocoCampo(context, _estoqueFocus, _codigoFocus);
                  },
                )
              ],
            )));
  }
import 'package:flutter/services.dart';
import 'package:intl/intl.dart';
class CurrencyPtBrFormatter extends TextInputFormatter {
  CurrencyPtBrFormatter({this.maxDigits});
  final int maxDigits;
  double _uMaskValue;
  TextEditingValue formatEditUpdate(
      TextEditingValue oldValue, TextEditingValue newValue) {
    if (newValue.selection.baseOffset == 0) {
      return newValue;
    }
    if (maxDigits != null && newValue.selection.baseOffset > maxDigits) {
      return oldValue;
    }
    double value = double.parse(newValue.text);
    final formatter = new NumberFormat("#,##0.00", "pt_BR");
    String newText = "R\$ " + formatter.format(value / 100);
    //setting the umasked value
    _uMaskValue = value / 100;
    return newValue.copyWith(
        text: newText,
        selection: new TextSelection.collapsed(offset: newText.length));
  }
  //here the method
  double getUnmaskedDouble() {
    return _uMaskValue;
  }
}
...
inputFormatters: [
  CurrencyTextInputFormatter(
    decimalDigits: 0,
    locale: 'ru',
  )
]
...