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',
)
]
...