Flutter数字格式化插件number_mask的使用

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

Flutter数字格式化插件number_mask的使用

number_mask 是一个轻量级的 Flutter 插件,旨在帮助开发者更轻松地对数字字段进行掩码或格式化,而无需创建新的字段小部件。它允许用户通过简单的配置来实现输入框的格式化。


作者


使用方法

NumberMask 的使用非常简单。只需在输入框的 inputFormatters 中添加 NumberMask,并指定格式化的模式即可。

基本用法

NumberMask(pattern: '###-###-####')

在模式字符串中,# 表示需要输入数字的位置。模式可以包含任何字符,包括字母和符号,只要这些字符通常可以在 TextFieldTextFormField 中输入即可。输入内容会自动根据定义的模式进行掩码处理。

示例

以下是一个电话号码格式化的示例:

import 'package:number_mask/number_mask.dart';

...

TextFormField(
    controller: _phoneController,
    decoration: const InputDecoration(
        labelText: 'Phone Number*',
    ),
    keyboardType: TextInputType.phone,
    inputFormatters: [
        NumberMask(pattern: '###-###-#### Ext. ###'),
    ],
),

上述代码会将用户输入自动格式化为以下形式:

555-555-5555 Ext. 555

如果未定义模式,则默认为自由格式(即空模式),这允许只输入数字且不限制长度。


完整示例

以下是一个完整的 Flutter 示例,展示了如何使用 number_mask 对不同类型的输入进行格式化。

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'NumberMask Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: const Text('NumberMask Demo'),
        ),
        body: const ExampleForm(),
      ),
    );
  }
}

class ExampleForm extends StatefulWidget {
  const ExampleForm({super.key});

  [@override](/user/override)
  State<ExampleForm> createState() => _ExampleFormState();
}

class _ExampleFormState extends State<ExampleForm> {
  final _formKey = GlobalKey<FormState>();
  final _phoneController = TextEditingController();
  final _ssnController = TextEditingController();
  final _creditCardController = TextEditingController();
  final _dateController = TextEditingController();
  final _zipController = TextEditingController();

  [@override](/user/override)
  void initState() {
    super.initState();
    // 设置初始值
    _phoneController.text = '(123) 456-7890 Ext. 123';
    _ssnController.text = '123-45-6789';
    _creditCardController.text = '1234 5678 9012 3456 - 789';
    _dateController.text = '01/19/2023';
    _zipController.text = '12345-6789';
  }

  [@override](/user/override)
  void dispose() {
    _phoneController.dispose();
    _ssnController.dispose();
    _creditCardController.dispose();
    _dateController.dispose();
    _zipController.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    // 定义各个字段的模式
    var phonePattern = '(###) ###-#### Ext. ###';
    var ssnPattern = '###-##-####';
    var creditCardPattern = '#### #### #### #### - ###';
    var datePattern = '##/##/####';
    var zipPattern = '#####-####';

    return Form(
      key: _formKey,
      child: Padding(
        padding: const EdgeInsets.all(16.0),
        child: SingleChildScrollView(
          child: Column(
            children: [
              // 手机号码输入框
              TextFormField(
                controller: _phoneController,
                decoration: InputDecoration(
                  labelText: 'Phone Number',
                  hintText: phonePattern,
                ),
                keyboardType: TextInputType.number,
                inputFormatters: [NumberMask(pattern: phonePattern)],
              ),
              const SizedBox(height: 16.0),
              // 社保号输入框
              TextFormField(
                controller: _ssnController,
                decoration: InputDecoration(
                  labelText: 'Social Security Number',
                  hintText: ssnPattern,
                ),
                keyboardType: TextInputType.number,
                inputFormatters: [NumberMask(pattern: ssnPattern)],
              ),
              const SizedBox(height: 16.0),
              // 信用卡号输入框
              TextFormField(
                controller: _creditCardController,
                decoration: InputDecoration(
                  labelText: 'Credit Card',
                  hintText: creditCardPattern,
                ),
                keyboardType: TextInputType.number,
                inputFormatters: [NumberMask(pattern: creditCardPattern)],
              ),
              const SizedBox(height: 16.0),
              // 日期输入框
              TextFormField(
                controller: _dateController,
                decoration: InputDecoration(
                  labelText: 'Date',
                  hintText: datePattern,
                ),
                keyboardType: TextInputType.number,
                inputFormatters: [NumberMask(pattern: datePattern)],
              ),
              const SizedBox(height: 16.0),
              // 邮政编码输入框
              TextFormField(
                controller: _zipController,
                decoration: InputDecoration(
                  labelText: 'Zip Code',
                  hintText: zipPattern,
                ),
                keyboardType: TextInputType.number,
                inputFormatters: [NumberMask(pattern: zipPattern)],
              ),
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


number_mask 是一个用于在 Flutter 中格式化数字输入的插件。它可以帮助你在输入框中自动添加千位分隔符、小数点等格式,使得用户输入的数字更加易读和符合格式要求。

安装

首先,你需要在 pubspec.yaml 文件中添加 number_mask 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  number_mask: ^0.0.1

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

使用

number_mask 插件提供了一个 NumberMask 类,你可以通过它来创建一个格式化器,并将其应用到 TextFieldTextFormField 中。

以下是一个简单的示例,展示如何使用 number_mask 插件来格式化用户输入的数字:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Number Mask Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: NumberMaskExample(),
        ),
      ),
    );
  }
}

class NumberMaskExample extends StatefulWidget {
  [@override](/user/override)
  _NumberMaskExampleState createState() => _NumberMaskExampleState();
}

class _NumberMaskExampleState extends State<NumberMaskExample> {
  final _controller = TextEditingController();
  final _numberMask = NumberMask(
    decimalSeparator: '.',
    thousandSeparator: ',',
    precision: 2,
  );

  [@override](/user/override)
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return TextField(
      controller: _controller,
      keyboardType: TextInputType.numberWithOptions(decimal: true),
      decoration: InputDecoration(
        labelText: 'Enter a number',
      ),
      onChanged: (value) {
        final formattedValue = _numberMask.apply(value);
        _controller.value = _controller.value.copyWith(
          text: formattedValue,
          selection: TextSelection.collapsed(offset: formattedValue.length),
        );
      },
    );
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!