Flutter货币处理插件flutter_money的使用

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

Flutter货币处理插件flutter_money的使用

本项目基于 FlutterMoneyFormatter。以下为原README的重述。

FlutterMoney 是一个针对 Flutter 的扩展插件,用于根据你的喜好格式化各种类型的货币,而不必受限于任何本地化设置。

最新版本 最后提交 许可证

依赖项 :

intl

安装

要安装 FlutterMoney,你可以查看 安装指南


使用

首先导入库:

import 'package:flutter_money/flutter_money.dart';

入门

为了能够将 double 类型的值格式化为你想要的各种形式,你需要创建一个 FlutterMoney 实例,如下所示:

FlutterMoney fm = FlutterMoney(
    amount: 12345678.9012345
);

注意,上述代码仍然使用了默认配置,如在配置部分所解释的那样。

创建实例后,你可以请求各种格式的结果,如下所示:

// 正常格式
print(fm.output.nonSymbol); // 12,345,678.90
print(fm.output.symbolOnLeft); // $ 12,345,678.90
print(fm.output.symbolOnRight); // 12,345,678.90 $
print(fm.output.fractionDigitsOnly); // 90
print(fm.output.withoutFractionDigits); // 12,345,678

// 简约格式
print(fm.output.compactNonSymbol) // 12.3M
print(fm.output.compactSymbolOnLeft) // $ 12.3M
print(fm.output.compactSymbolOnRight) // 12.3M $

如果你将输出格式多次使用,我强烈建议你初始化一个变量,如下所示:

MoneyFormatterOutput fo = fm.output;

或者在初始化 FlutterMoney 实例时直接赋值,如下所示:

MoneyFormatterOutput fo = FlutterMoney(
    amount: 12345678.9012345
).output;

这样你就可以更方便地获取值,如下所示:

// 正常格式
print(fo.nonSymbol); // 12,345,678.90
print(fo.symbolOnLeft); // $ 12,345,678.90
print(fo.symbolOnRight); // 12,345,678.90 $
print(fo.fractionDigitsOnly); // 90
print(fo.withoutFractionDigits); // 12,345,678

// 简约格式
print(fo.compactNonSymbol) // 12.3M
print(fo.compactLeftSymbol) // $ 12.3M
print(fo.compactRightSymbol) // 12.3M $

更多详细信息,请参见 演示部分


配置

要根据你的需求调整格式,你可以通过 settings 参数进行设置:

FlutterMoney fm = new FlutterMoney(
    amount: 12345678.9012345,
    settings: MoneyFormatterSettings(
        symbol: 'IDR',
        thousandSeparator: '.',
        decimalSeparator: ',',
        symbolAndNumberSeparator: ' ',
        fractionDigits: 3,
        compactFormatType: CompactFormatType.sort
    )
)

当然,你不必在 settings (MoneyFormatterSettings) 参数中初始化整个配置,如上例所示。你可以更改上述配置中的一个或多个。这是因为上述每个配置都不是强制性的,并且有默认值。


属性、方法和函数

FlutterMoney

属性名称 数据类型 描述
amount double 将要格式化的金额数字。
settings MoneyFormatterSettings 详见 MoneyFormatterSettings
output MoneyFormatterOutput 详见 MoneyFormatterOutput
comparator MoneyFormatterCompare 详见 MoneyFormatterCompare
copyWith FlutterMoney 详见 复制实例
fastCalc FlutterMoney 详见 快速计算

MoneyFormatterSettings

配置属性 数据类型 默认值 描述
symbol String $(美元符号) 格式化输出中使用的符号。
thousandSeparator String , 格式化输出中用作千位分隔符的字符。
decimalSeparator String . 格式化输出中用作小数点分隔符的字符。
fractionDigits int 2 格式化输出中小数点后的位数。
symbolAndNumberSeparator String ' '(空格) 格式化数字和货币符号之间的分隔符。
compactFormatType CompactFormatType CompactFormatType.short 详见 CompactFormatType

CompactFormatType

你可以更改紧凑格式类型,例如使用 Mmillion 表示百万,或使用 Ttrillion 表示万亿等。这种类型只支持两种类型,如下所述:

描述
CompactFormatType.short 用于使紧凑格式显示为短文本。
CompactFormatType.long 用于使紧凑格式显示为长文本。

MoneyFormatterOutput

你可以通过 MoneyFormatterOutput 实例中的属性来使用符合你需求的格式。

属性名称 数据类型 描述
nonSymbol String 货币格式化结果,不带货币符号。例如:12,345,678.90
symbolOnLeft String 带货币符号的正常货币格式,符号在左边。例如:$ 12,345,678.90
symbolOnRight String 带货币符号的正常货币格式,符号在右边。例如:12,345,678.90 $
compactNonSymbol String 紧凑格式化结果,不带货币符号。例如:12.3M
compactSymbolOnLeft String 紧凑格式化结果,带货币符号在左边。例如:$ 12.3M
compactSymbolOnRight String 紧凑格式化结果,带货币符号在右边。例如:12.3M $
fractionDigitsOnly String 只给出分数值。例如:90
withoutFractionDigits String 给出不带分数的值。例如:12,345,678

MoneyFormatterCompare

方法 参数 描述
isLowerThan amount 检查当前实例的金额是否小于 [amount]
isGreaterThan amount 检查当前实例的金额是否大于 [amount]
isEqual amount 检查当前实例的金额是否等于 [amount]
isEqualOrLowerThan amount 检查当前实例的金额是否等于或小于 [amount]
isEqualOrGreaterThan amount 检查当前实例的金额是否等于或大于 [amount]

使用比较器的例子:

FlutterMoney fm = FlutterMoney(amount: 12345678.9012345);
double comparerValue = 5678.9012;

print(fm.comparator.isEqual(comparerValue)); // false
print(fm.comparator.isGreaterThan(comparerValue)); // true

快速计算

fastCalc 是一个可以用于执行各种快速计算过程的函数。在实现时,fastCalc 函数返回一个 FlutterMoney 实例,因此你可以通过链式方法一次执行多个计算功能。

函数

FlutterMoney fastCalc({
    @required FastCalcType type, 
    @required double amount
})

实现

FlutterMoney fm = FlutterMoney(amount: 12345.678);
fm.fastCalc(type: FastCalcType.addition, amount: 1.111);
fm.fastCalc(type: FastCalcType.substraction, amount: 2.222);

print(fm.output.nonSymbol); // 12,345.68

由于它支持链式过程,上面的示例可以简化为:

FlutterMoney fm = FlutterMoney(amount: 12345.678)
    .fastCalc(type: FastCalcType.addition, amount: 1.111)
    .fastCalc(type: FastCalcType.substraction, amount: 2.222);

print(fm.output.nonSymbol);  // 12,345.68

type 参数由 FastCalcType 数据类型枚举提供。以下是 FastCalcType 枚举的说明表:

索引 名称 描述
0 addition 用于做加法运算。
1 substraction 用于做减法运算。
2 multiplication 用于做乘法运算。
3 division 用于做除法运算。
4 percentageAddition 用于基于百分比的加法运算。
5 percentageSubstraction 用于基于百分比的减法运算。

复制实例

出于某些原因,你可能需要复制实例并仅更改一些配置。为此,你可以使用 copyWith 方法,如下所示:

FlutterMoney fm = FlutterMoney(amount: 12345678.9012345);

print(fm.output.symbolOnLeft); // $ 12,345,678.90
print(fm.copyWith(symbol: 'IDR', symbolAndNumberSeparator: '-').output.symbolOnLeft); // IDR-12,345,678.90

演示

更多完整的示例,你可以从 示例目录 获取。


我们的其他包

查看我们的 其他包


帮助我

如果你发现任何问题或错误,请在这里 报告问题。你也可以在这里 请求新功能


更改日志

你对每次版本的变化感到好奇吗? 这里 查看详细的变更信息。


贡献者

姓名 链接
Fadhly Permata https://github.com/fadhly-permata
Gerrel https://github.com/Gerrel
Emeka Nwagu https://github.com/nwagu
…你… …你的链接…

许可证

版权所有 (c) 2019, Fadhly Permata <fadhly.permata@gmail.com>
保留所有权利。

重新分发和使用源码和二进制形式,无论是修改还是未修改,均允许,但须满足以下条件:

1. 源码的重新分发必须保留上述版权声明、此条件列表和以下免责声明。
2. 二进制形式的重新分发必须在文档和/或其他提供的材料中包含上述版权声明、此条件列表和以下免责声明。

此软件按“现状”提供,没有任何明示或暗示的保证,包括但不限于适销性和适用于特定用途的默示保证。在任何情况下,版权持有者或贡献者都不应对任何直接、间接、附带、特殊、惩戒性或后果性损害负责(包括但不限于替代商品或服务的采购、数据或利润的损失、或业务中断)无论这些损害是如何引起的,即使已被告知发生此类损害的可能性。

软件和文档中包含的观点和结论属于作者,不应被解释为官方政策,无论是明示的还是暗示的,代表“FlutterMoney”项目的观点。

更多关于Flutter货币处理插件flutter_money的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter货币处理插件flutter_money的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用flutter_money插件来处理货币的基本示例。flutter_money插件允许你格式化、解析和显示货币金额。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加flutter_money依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_money: ^2.0.0  # 请检查最新版本号

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

2. 导入插件

在你的Dart文件中导入flutter_money插件:

import 'package:flutter_money/flutter_money.dart';

3. 配置货币设置

你需要配置货币设置,比如货币符号、小数点分隔符、千位分隔符等。

void main() {
  // 配置货币设置
  MoneyFormat format = MoneyFormat(
    symbol: '\$',  // 货币符号
    decimalSeparator: '.',  // 小数点分隔符
    thousandSeparator: ',',  // 千位分隔符
    precision: 2,  // 小数位数
  );

  runApp(MyApp(format));
}

4. 使用插件

下面是一个简单的例子,展示如何格式化金额和解析字符串金额:

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

void main() {
  MoneyFormat format = MoneyFormat(
    symbol: '\$',
    decimalSeparator: '.',
    thousandSeparator: ',',
    precision: 2,
  );

  runApp(MyApp(format));
}

class MyApp extends StatelessWidget {
  final MoneyFormat format;

  MyApp(this.format);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Money Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(format: format),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final MoneyFormat format;

  MyHomePage({required this.format});

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late double amount;

  @override
  void initState() {
    super.initState();
    amount = 1234567.89;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Money Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text('Formatted Amount:'),
            Text(
              formatMoney(amount, widget.format),
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 16),
            Text('Parse Amount from String:'),
            TextField(
              decoration: InputDecoration(
                border: OutlineInputBorder(),
                labelText: 'Enter amount (e.g., \$1,234,567.89)',
              ),
              onSubmitted: (value) {
                double? parsedAmount = parseMoney(value, widget.format);
                if (parsedAmount != null) {
                  setState(() {
                    amount = parsedAmount;
                  });
                }
              },
            ),
            SizedBox(height: 16),
            Text('Parsed Amount: ${formatMoney(amount, widget.format)}'),
          ],
        ),
      ),
    );
  }
}

// 辅助函数
String formatMoney(double amount, MoneyFormat format) {
  return Money(amount, currency: format.symbol).format(
    locale: 'en_US',
    decimalDigits: format.precision,
    symbolOnLeft: true,
    separator: format.thousandSeparator,
    decimalSeparator: format.decimalSeparator,
  );
}

double? parseMoney(String amountStr, MoneyFormat format) {
  try {
    return double.parse(
      amountStr.replaceAllMapped(
        RegExp(r'[^\d\.\,]', multiLine: true, caseSensitive: false),
        (match) {
          if (match[0] == ',') return '.';
          return '';
        },
      ),
    );
  } catch (_) {
    return null;
  }
}

说明

  1. 配置货币设置:在main函数中,我们创建了一个MoneyFormat实例来配置货币格式。
  2. 格式化金额formatMoney函数使用Money类来格式化金额。
  3. 解析字符串金额parseMoney函数尝试从字符串中解析金额,并处理千位分隔符和小数点分隔符的差异。

请注意,parseMoney函数是一个简单的实现,并没有完全遵循flutter_money插件的所有功能。实际项目中,你可能需要更复杂的解析逻辑或依赖插件的内置解析功能(如果可用)。

希望这个示例对你有帮助!

回到顶部