You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 18:18:29