我想在Flutter中使用逗号分隔符,以便在键入时将数字格式化为以下格式:"#,##,##,###.##"
,但我不想包括小数位,除非我们键入。ThousandsFormatter
类正在按预期格式化数字,但它不允许小数输入。我想在必要时允许最多两个小数输入,而不影响数字格式。
下面是一些我希望在代码中使用的数字格式示例:1,00,00,000
15,000.34
23,12,340.45
、45,434.5
、55,334
等。不带小数的数字输入工作正常。
它还有一个关于逗号的问题。它将逗号的计数添加到TextField
输入的maxLength
中。因此,为了输入八位数字,我将maxLength
设置为十一位。
任何建议将不胜感激。以下是我尝试过的代码:
- 类千位格式化程序:**
import 'package:flutter/services.dart';
import 'package:intl/intl.dart';
class ThousandsFormatter extends TextInputFormatter {
@override
TextEditingValue formatEditUpdate(
TextEditingValue oldValue, TextEditingValue newValue) {
final newText = newValue.text;
if (newText.isEmpty) {
return newValue;
}
int selectionIndex = newValue.selection.end;
final String newTextFormatted = NumberFormat("#,##,##,###")
.format(double.tryParse(newText.replaceAll(",", "")));
if (newText == newTextFormatted) {
return newValue;
}
selectionIndex += -(newText.length - newTextFormatted.length);
return TextEditingValue(
text: newTextFormatted,
selection: TextSelection.collapsed(offset: selectionIndex),
);
}
}
- 主省道**
TextField(
onEditingComplete: () {
FocusScope.of(context).requestFocus(_focusNodeY);
},
controller: principalController,
decoration: InputDecoration(
labelText: "Amount",
isDense: true,
counterText: "",
),
textAlign: TextAlign.start,
maxLines: 1,
maxLength: 11,
keyboardType: TextInputType.number,
inputFormatters: [
FilteringTextInputFormatter.digitsOnly,
FilteringTextInputFormatter.allow(
RegExp(r'^[0-9]+(\.[0-9]{0,2})?$')),
ThousandsFormatter(),
],
),
2条答案
按热度按时间pes8fvy91#
根据您提供的代码,看起来您使用了ThousandsFormatter类将输入格式化为带有千位分隔符的数字,但您还使用了FilteringTextInputFormatter类以仅允许数字和最多两位小数。
若要允许小数位而不影响千位分隔符的格式,可以修改ThousandsFormatter类以检查输入是否包含小数点,如果包含,则将数字格式设置为小数点,并保留小数位不变。例如:
这样,如果输入包含小数点,它将格式化数字直到小数点并保留小数位,如果不包含小数点,它将使用千位分隔符格式化整个数字。
关于TextField的maxLength,您可以在计算TextField的maxLength时从inputFormatter列表中删除ThousandsFormatter。
6l7fqoea2#
试试这个