Flutter金额输入格式化插件money_input_formatter的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter金额输入格式化插件 money_input_formatter 的使用

money_input_formatter 是一个用于在 Flutter 应用中格式化货币输入的插件。它支持多种货币格式,如法语中的“1 333,34”和英语中的“1,333.34”,并且能够自动删除不必要的“.00”以提高可读性。

特性

  • 支持配置小数点和千位分隔符。
  • 自动删除 .00 以使数字更易读。
  • 处理空格的删除和光标位置。
  • 在生产环境中经过充分测试,并且包含广泛的单元测试。

使用方法

只需将 MoneyInputFormatter 作为 inputFormatters 参数传递给任何输入框即可。

基本示例

TextFormField(
  inputFormatters: [MoneyInputFormatter()],
  keyboardType: TextInputType.number,
)

使用控制器获取数值

该插件还提供了一个控制器来获取输入值作为数字:

import 'package:flutter/material.dart';
import 'package:money_input_formatter/money_input_controller.dart';
import 'package:money_input_formatter/money_input_formatter.dart';

class MoneyInputWidget extends StatefulWidget {
  [@override](/user/override)
  State<MoneyInputWidget> createState() => _MoneyInputWidgetState();
}

class _MoneyInputWidgetState extends State<MoneyInputWidget> {
  final controller = MoneyInputController();
  double value = 0;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return TextFormField(
      textAlign: TextAlign.end,
      keyboardType: TextInputType.number,
      controller: controller,
      onChanged: (_) => setState(() => value = controller.numberValue),
      inputFormatters: [MoneyInputFormatter()],
    );
  }
}

完整示例 Demo

以下是一个完整的示例,展示了如何使用 money_input_formatter 插件来格式化输入框中的货币值。

import 'package:flutter/material.dart';
import 'package:money_input_formatter/money_input_controller.dart';
import 'package:money_input_formatter/money_input_formatter.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'MoneyInputFormatter Demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final controller = MoneyInputController();
  double value = 0;

  [@override](/user/override)
  void initState() {
    controller.numberValue = 0;
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextFormField(
              textAlign: TextAlign.end,
              keyboardType: TextInputType.number,
              controller: controller,
              onChanged: (_) => setState(() => value = controller.numberValue),
              inputFormatters: [MoneyInputFormatter()],
            ),
            Container(
              margin: const EdgeInsets.only(top: 30),
              child: Text('Value entered: $value', style: const TextStyle(fontSize: 15)),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter金额输入格式化插件money_input_formatter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter金额输入格式化插件money_input_formatter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用money_input_formatter插件进行金额输入格式化的示例代码。这个插件可以帮助你自动格式化用户输入的金额,例如添加千位分隔符和小数点。

首先,确保你已经在pubspec.yaml文件中添加了money_input_formatter依赖:

dependencies:
  flutter:
    sdk: flutter
  money_input_formatter: ^x.y.z  # 请替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter项目中使用这个插件。以下是一个完整的示例,展示如何在一个简单的Flutter应用中实现金额输入格式化:

import 'package:flutter/material.dart';
import 'package:money_input_formatter/money_input_formatter.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Money Input Formatter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MoneyInputFormatterDemo(),
    );
  }
}

class MoneyInputFormatterDemo extends StatefulWidget {
  @override
  _MoneyInputFormatterDemoState createState() => _MoneyInputFormatterDemoState();
}

class _MoneyInputFormatterDemoState extends State<MoneyInputFormatterDemo> {
  final TextEditingController _controller = TextEditingController();
  MoneyInputFormatter _formatter;

  @override
  void initState() {
    super.initState();
    // 配置格式化器,可以根据需要调整locale和decimalPlaces等参数
    _formatter = MoneyInputFormatter(
      locale: 'en_US', // 设置语言环境
      decimalPlaces: 2, // 设置小数点位数
      symbol: '\$', // 设置货币符号
      thousandSeparator: ',', // 设置千位分隔符
      decimalSeparator: '.', // 设置小数点分隔符
    );

    // 监听文本控制器变化以应用格式化
    _controller.addListener(() {
      if (_controller.text.isNotEmpty) {
        final formattedText = _formatter.format(_controller.text);
        _controller.value = _controller.value.copyWith(text: formattedText);
        // 确保光标位置正确
        _controller.selection = TextSelection.collapsed(offset: formattedText.length);
      }
    });
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Money Input Formatter Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            TextField(
              controller: _controller,
              keyboardType: TextInputType.numberWithOptions(decimal: true),
              decoration: InputDecoration(
                labelText: 'Enter amount',
                border: OutlineInputBorder(),
              ),
              inputFormatters: [
                // 这里不需要额外的TextEditingFormatter,因为我们在controller中处理格式化
                FilteringTextInputFormatter.digitsOnly, // 仅允许输入数字
              ],
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个MoneyInputFormatter实例,并在文本控制器的监听器中应用格式化。这确保了每当用户输入文本时,输入都会自动格式化为货币格式。

注意:

  • locale参数决定了格式化的区域设置。
  • decimalPlaces参数决定了小数点后的位数。
  • symbol参数设置了货币符号。
  • thousandSeparatordecimalSeparator参数分别设置了千位分隔符和小数点分隔符。

这样,你就可以在Flutter应用中方便地实现金额输入的格式化了。

回到顶部