Flutter 如何在Flatter中的文本字段上设置输入货币的格式(从右到左)?
在Flutter 如何在Flatter中的文本字段上设置输入货币的格式(从右到左)?,flutter,dart,Flutter,Dart,在TextField中,我有一个初始文本0.00,那么一旦用户开始在flatter中键入,我如何格式化键入的值?我目前正在使用该软件包,但无法达到预期效果 例如,如果用户键入数字,我需要以下行为:1.800.45: 当用户点击1时。我们应该有0.01 当用户点击8时。我们应该显示0.18 当用户点击0时。我们应该显示1.80 当用户点击0时。我们应该显示1.800 当用户点击4时。我们应该显示1.800,4 当用户点击5时。我们应该显示1.800,45 我当前的代码: class\u Money
TextField
中,我有一个初始文本0.00
,那么一旦用户开始在flatter中键入,我如何格式化键入的值?我目前正在使用该软件包,但无法达到预期效果
例如,如果用户键入数字,我需要以下行为:1.800.45
:
当用户点击1时。我们应该有0.01
当用户点击8时。我们应该显示
0.18
当用户点击0时。我们应该显示
1.80
当用户点击0时。我们应该显示
1.800
当用户点击4时。我们应该显示
1.800,4
当用户点击5时。我们应该显示
1.800,45
我当前的代码:
class\u MoneyTextFormField扩展了无状态小部件{
TextEditingController _controller=TextEditingController();
@凌驾
小部件构建(构建上下文){
返回TextFormField(
控制器:_控制器,
样式:TextStyle(颜色:context.primaryColor),
键盘类型:TextInputType.number,
输入格式化程序:[
TextInputFormatter.withFunction((旧值、新值){
//删除字符以将值转换为双精度(因为其中一个字符可能出现在键盘上)
字符串newText=newValue.text.replaceAll(MoneyTextFormField.\u cents,'')
.replaceAll('.','')
.replaceAll(“,”,“)
.replaceAll(“”,“”)
.replaceAll(“-”,“”);
字符串值=新文本;
int cursorPosition=newText.length;
if(newText.isNotEmpty){
value=formatCurrency(double.parse(newText),fractionDigits:0);
光标位置=value.length;
}
返回TextEditingValue(
文本:值,
选择:文本选择。折叠(偏移:光标位置)
);
}),
],
);
}
}
设置值格式的函数:
///格式化给定值并将值作为字符串返回
///注意:参数应为int或double
静态字符串格式货币(数值,{int fractionDigits=2}){
ArgumentError.checkNotNull(值,'value');
返回格式化程序(
金额:value.toDouble(),
设置:MoneyFormatterSettings(
千分位分隔符:''',
小数分隔符:',',
fractionDigits:fractionDigits
),
).output.nonSymbol;
}
注意:这不是的副本,因为该解决方案不适用于颤振。我刚刚使用Intl软件包找到了解决方案。只要使用下面的
formatCurrency
方法,一切都会得到解决
注意:该值应始终以美分为单位。这就是为什么我们将其除以100,得到美分,并将结果传递给格式化程序
静态字符串格式货币(num值,{int fractionDigits=2}){
ArgumentError.checkNotNull(值,'value');
//把美分换成几百美元。
数值=数值/100;
返回号码格式货币(
customPattern:“####,###.##”,
//使用荷兰,因为这个国家
//使用逗号表示千,点表示小数分隔符。
区域设置:“nl_nl”
).格式(值);
}
您可以使用这种方式
bool isFirst = true;
TextFormField(
controller: addAmountController,
keyboardType: TextInputType.number,
inputFormatters: <TextInputFormatter>[FilteringTextInputFormatter.digitsOnly],
onChanged: (value) {
String newValue = value.replaceAll(',', '').replaceAll('.', '');
if (value.isEmpty || newValue == '00') {
addAmountController.clear();
isFirst = true;
return;
}
double value1 = double.parse(newValue);
if (!isFirst) value1 = value1 * 100;
value = NumberFormat.currency(customPattern: '###,###.##').format(value1 / 100);
addAmountController.value = TextEditingValue(
text: value,
selection: TextSelection.collapsed(offset: value.length),
);
},
)
bool isFirst=true;
TextFormField(
控制器:addAmountController,
键盘类型:TextInputType.number,
inputFormatters:[FilteringtInputFormatter.digitsOnly],
一旦更改:(值){
字符串newValue=value.replaceAll('','','').replaceAll('.','');
如果(value.isEmpty | | newValue='00'){
addAmountController.clear();
isFirst=true;
返回;
}
double value1=double.parse(newValue);
如果(!isFirst)value1=value1*100;
value=NumberFormat.currency(customPattern:'#########.##')。格式(值1/100);
addAmountController.value=文本编辑值(
文本:值,
选择:TextSelection.collapsed(偏移量:value.length),
);
},
)
嗨!我也有同样的问题。你能告诉我这个功能在哪里实现吗?在控制器或inputFormatter中?通过此方法在格式化程序中传递返回值。