Flutter中如何使用Formatter格式化TextFormField的初始值?
解决TextField初始值千分位格式化问题
当然可以用现有的ThousandTextInputFormatter处理初始值,核心是把格式化逻辑抽离成可复用方法,既支持编辑时的实时格式化,也能直接处理初始值。
步骤1:重构格式化器,抽离通用格式化逻辑
修改ThousandTextInputFormatter,将字符串格式化的核心代码单独做成静态方法,实现代码复用:
class ThousandTextInputFormatter extends TextInputFormatter { static const separator = ' '; // 改为空格,对应你需要的500 000格式 // 通用方法:把原始数字字符串转为千分位格式 static String formatRawString(String rawText) { if (rawText.isEmpty) return ''; // 先清除所有已有的分隔符 final cleanedText = rawText.replaceAll(separator, ''); final chars = cleanedText.split(''); String formattedString = ''; for (int i = chars.length - 1; i >= 0; i--) { // 每3位添加分隔符(跳过最后一位) if ((chars.length - 1 - i) % 3 == 0 && i != chars.length - 1) { formattedString = separator + formattedString; } formattedString = chars[i] + formattedString; } return formattedString; } @override TextEditingValue formatEditUpdate( TextEditingValue oldValue, TextEditingValue newValue) { if (newValue.text.length == 0) { return newValue.copyWith(text: ''); } String oldValueText = oldValue.text.replaceAll(separator, ''); String newValueText = newValue.text.replaceAll(separator, ''); if (oldValue.text.endsWith(separator) && oldValue.text.length == newValue.text.length + 1) { newValueText = newValueText.substring(0, newValueText.length - 1); } if (oldValueText != newValueText) { int selectionIndex = newValue.text.length - newValue.selection.extentOffset; // 复用通用格式化方法 final formattedText = formatRawString(newValueText); return TextEditingValue( text: formattedText, selection: TextSelection.collapsed( offset: formattedText.length - selectionIndex, ), ); } return newValue; } }
步骤2:初始化控制器时格式化初始值
创建TextEditingController时,调用上面的formatRawString方法预先处理初始值:
var sumController = TextEditingController( text: ThousandTextInputFormatter.formatRawString(500000.toString()) );
步骤3:保持原有TextField配置不变
原有的TextFormField配置无需修改,继续使用该格式化器即可:
TextFormField( inputFormatters: [ThousandTextInputFormatter()], controller: sumController, )
这样设置后,初始值会直接显示为500 000,用户编辑时也会实时按千分位格式更新内容。
内容的提问来源于stack exchange,提问作者user5182503
相关产品推荐
相关产品推荐

