【问题标题】:not able to solve number format in currency?无法解决货币数字格式?
【发布时间】:2021-05-05 02:02:26
【问题描述】:

我试过 NumberFormat "#,##0.##"

我试过 NumberFormat "#,##0.00"

我试过 NumberFormat "#,##0.#0"

我想要的格式是 (123,4567.89)

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:intl/intl.dart';

class CurrencyFormat extends TextInputFormatter {
  @override
  TextEditingValue formatEditUpdate(
      TextEditingValue oldValue, TextEditingValue newValue) {
    // TODO: implement formatEditUpdate
    if (newValue.selection.baseOffset == 0) {
      return newValue;
    }
    double value = double.parse(newValue.text);
    final money = NumberFormat("#,###.##", "en_US");

    String newText = money.format(value);

    return newValue.copyWith(
        text: newText,
        selection: TextSelection.collapsed(offset: newText.length));
  }
}

我在 textformfield 小部件中调用此货币格式

'''
Widget mrpTextField() {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: TextFormField(
        keyboardType: TextInputType.number,
        inputFormatters: [
          FilteringTextInputFormatter.digitsOnly,
          CurrencyFormat()
        ],
        controller: _mrp,
        validator: (value) {
          if (value.isEmpty) {
            return "MRP";
          }else if (value.length > 6) {
            return "";
          }
          return null;
        },
        decoration: InputDecoration(
          labelText: "Enter MRP",
        ),
        maxLines: null,
      ),
    );
  }
'''

【问题讨论】:

  • 那么您希望格式是货币格式还是常规数字格式?您总是可以只使用NumberFormat.currencyNumberFormat.simpleCurrency
  • 实际情况是我正在尝试创建一个应用程序,我想在其中限制用户输入最多 6 位数字,如果他使用十进制数字,则只能使用小数点后的 2 个数字跨度>
  • 希望你明白我的意思
  • 那你不要NumberFormat,你要TextInputFormatter
  • @sadhanchilka 在你的情况下,你应该使用"#,###0.00",你可以在https://stackoverflow.com/questions/51738935/flutter-using-numberformat-in-textinputformatter找到解决方案

标签: flutter dart currency number-formatting flutter-intl


【解决方案1】:

TextFormField 中将FilteringTextInputFormatter.digitsOnly, 更改为FilteringTextInputFormatter.allow(RegExp("[0-9\.]")),

CurrencyFormat

  class CurrencyFormat extends TextInputFormatter {
  @override
  TextEditingValue formatEditUpdate(
      TextEditingValue oldValue, TextEditingValue newValue) {
    if (newValue.text.isEmpty) {
      return newValue.copyWith(text: '');
    } else if (newValue.text == ".") {
      return newValue.copyWith(
        text: '0.00',
        selection: TextSelection.collapsed(offset: 2),
      );
    } else {
      NumberFormat f = NumberFormat("#,###0.00", "en_US");
      double newNumber = 0;
      if ((!newValue.text.contains(".")) && oldValue.text.contains('.')) {
        String tempString = newValue.text.replaceAll(f.symbols.GROUP_SEP, '');
        tempString = tempString.substring(0, tempString.length - 2) +
            "." +
            tempString.substring(tempString.length - 2);
        newNumber = double.parse(tempString);
      } else {
        newNumber = double.parse(newValue.text
            .replaceAll(f.symbols.GROUP_SEP, '')
            .replaceAll("..", '.'));
      }
      String newString = f.format(newNumber);
      int cursorPosition = 0;
      if (oldValue.text.length > newString.length) {
        cursorPosition = -1;
      } else if (oldValue.text.length < newString.length) {
        cursorPosition = 1;
      } else {
        if (oldValue.text.replaceAll(f.symbols.GROUP_SEP, '').length >
            newValue.text.replaceAll(f.symbols.GROUP_SEP, '').length) {
          cursorPosition = -1;
          if (newString == "0.00" && oldValue.selection.baseOffset == 0) {
            newString = "";
          }
        } else if (oldValue.text.replaceAll(f.symbols.GROUP_SEP, '').length <
            newValue.text.replaceAll(f.symbols.GROUP_SEP, '').length) {
          cursorPosition = 1;
        } else if (oldValue.selection.extentOffset >
            oldValue.selection.baseOffset) {
          cursorPosition =
              oldValue.selection.baseOffset - oldValue.selection.extentOffset;
          newString =
              newString.substring(0, oldValue.selection.baseOffset - 1) +
                  newString.substring(oldValue.selection.baseOffset + 1);
          newNumber = double.parse(newString
              .replaceAll(f.symbols.GROUP_SEP, '')
              .replaceAll("..", '.'));
          newString = f.format(newNumber);
          if (newString == "0.00" && oldValue.selection.baseOffset == 0) {
            newString = "";
          }
        }
      }
      return TextEditingValue(
        text: newString,
        selection: TextSelection.collapsed(
            offset: oldValue.selection.extent.offset +
                cursorPosition +
                (f.symbols.GROUP_SEP.allMatches(newString).length -
                    f.symbols.GROUP_SEP.allMatches(oldValue.text).length)),
      );
    }
  }
}

同样,"#,###0.00" 是对的

【讨论】:

    猜你喜欢
    • 2017-03-23
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 2020-09-16
    • 2022-11-14
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    相关资源
    最近更新 更多