我需要限制用户输入1 ..这样的时间。我正在使用文本输入表单字段。我需要使用小数点输入文本格式化程序的类似1.23的输入
答案 0 :(得分:4)
不推荐使用WhitelistingTextInputFormatter
TextField(
keyboardType: TextInputType.numberWithOptions(decimal: true),
inputFormatters: <TextInputFormatter>[
FilteringTextInputFormatter.allow(RegExp(r'^\d+\.?\d*')),
], // Only numbers can be entered
),
答案 1 :(得分:1)
这是您针对特定用例需要做的事情:
TextFormField(
inputFormatters: [
WhitelistingTextInputFormatter(RegExp(r"\d+([\.]\d+)?")),
],
);
您需要使用TextInputFormatter
类。具体是WhitelistingTextInputFormatter。
以上代码仅允许您在问题中提供的模式编号。可以选择任意数量的十进制数字(允许带一个小数点)的数字。
如r
中的字符串前面的r""
前缀使字符串成为raw string
。这样可以防止过滤和处理字符串中的特殊字符。来自docs:
请注意,在上面的示例中使用了原始字符串(以r开头的字符串)。使用原始字符串将字符串中的每个字符视为文字字符。
这里是正则表达式模式^\d+([\.]\d+)?$
的剖析:
\d
位数字-来自所有语言的allows位数字。+
一个或多个事件。(PATTERN)?
出现零次或多次-允许数字不带小数点/数字。[\.]
允许使用点字符-由于\是正则表达式中的控制字符,因此\可以将其转义。答案 2 :(得分:1)
我们可以创建自己的TextInputFormatter
。
检查
import 'package:flutter/services.dart';
class DecimalTextInputFormatter extends TextInputFormatter {
@override
TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {
final regEx = RegExp(r"^\d*\.?\d*");
String newString = regEx.stringMatch(newValue.text) ?? "";
return newString == newValue.text ? newValue : oldValue;
}
}
用法:
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: FirstPage(),
debugShowCheckedModeBanner: false,
);
}
}
class FirstPage extends StatefulWidget {
@override
_FirstPageState createState() => _FirstPageState();
}
class _FirstPageState extends State<FirstPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: TextField(
inputFormatters: [DecimalTextInputFormatter()],
),
),
);
}
}
答案 3 :(得分:1)
om-ha的答案是正确的,但是为了将来参考,从1.20版开始,Flutter中不推荐使用WhitelistingTextInputFormatter,现在我们应该改用FilteringTextInputFormatter.allow()。
或者如果需要的话,使用FilteringTextInputFormatter.deny代替BlacklistingTextInputFormatter。
以上代码应变为:
TextFormField(
inputFormatters: [
FilteringTextInputFormatter.allow(RegExp(r"\d+([\.]\d+)?")),
],
);