跳转到正文
返回文章列表

Flutter 中使用 intl 格式化不同国家的货币

更新于 2026-10-02 20:02

金额展示通常要处理货币符号、千位分隔和小数位。Flutter 中可以使用 intl 的 NumberFormat.currency,按指定地区和币种格式化金额。

安装依赖

Bash
flutter pub add intl

先统一金额单位

下面的示例约定:人民币和美元以最小货币单位存储,展示前除以 100;日元直接以“日元”存储,不除以 100。

例如,99999 分人民币对应 999.99 元,而 20000 日元对应 20,000 日元。不能仅根据字段是整数,就统一把所有币种除以 100。如果接口采用自定义倍率,应先按接口约定换算。

使用扩展方法

dart
import 'package:intl/intl.dart';

extension CurrencyFormat on int {
  String toCNY({bool symbol = true}) {
    return NumberFormat.currency(
      locale: 'zh_CN',
      name: 'CNY',
      symbol: symbol ? '¥' : '',
      decimalDigits: 2,
    ).format(this / 100);
  }

  String toUSD({bool symbol = true}) {
    return NumberFormat.currency(
      locale: 'en_US',
      name: 'USD',
      symbol: symbol ? r'$' : '',
      decimalDigits: 2,
    ).format(this / 100);
  }

  String toJPY({bool symbol = true}) {
    return NumberFormat.currency(
      locale: 'ja_JP',
      name: 'JPY',
      symbol: symbol ? '¥' : '',
      decimalDigits: 0,
    ).format(this);
  }
}

locale 控制地区格式,name 指定 ISO 货币代码,symbol 控制符号,decimalDigits 指定小数位。明确指定参数,有助于避免环境默认值影响展示。

调用示例

将扩展保存到 lib/extensions/currency.dart,在调用处导入:

dart
import 'package:flutter/foundation.dart';
import 'extensions/currency.dart';

void example() {
  debugPrint(99999.toCNY()); // ¥999.99
  debugPrint(98600.toUSD()); // $986.00
  debugPrint(20000.toJPY()); // ¥20,000
  debugPrint(99999.toCNY(symbol: false)); // 999.99
}

这些方法用于显示,不负责换汇,也不改变原始金额。金额计算仍应遵循业务的币种、精度和舍入规则,不使用格式化后的字符串作为计算输入。

参考:intl NumberFormat.currency API。

评论 0

还没有公开评论。

评论已关闭,历史评论仍可阅读。

留下评论

评论审核通过后公开。支持纯文本,最多 2000 个字符。