简介

精准、易用的 Flutter 金额处理工具库,支持多方式初始化、高精度运算、格式化与序列化。

开始使用

import 'package:moneykit/moneykit.dart';

final money = Money.fromYuan(100);

核心特性说明

多方式初始化

// 1. 从分初始化(无精度损失,推荐)
final money1 = Money.fromCents(12345); // 123.45元

// 2. 从元初始化(支持int/double)
final money2 = Money.fromYuan(100); // 100元
final money3 = Money.fromYuan(99.99); // 99.99元
final money4 = Money.fromYuan(123.456); // 自动四舍五入为123.46元

// 3. 从字符串初始化(支持常见金额格式)
final money5 = Money.fromString("50"); // 50元
final money6 = Money.fromString("33.33"); // 33.33元
final money7 = Money.fromString("123.456"); // 123.46元

灵活的类型转换

 final money = Money.fromYuan(123.45);

// 转换为分(int)
int cents = money.toCents(); // 12345

// 转换为元(double)
double yuan = money.toYuan(); // 123.45

// 转换为元字符串
String yuanStr = money.toYuanString(); // "123.45"

// 转换为int(元为单位,向下取整)
int intYuan = money.toInt(); // 123

// 转换为JSON格式
Map<String, dynamic> json = money.toJson(); // {"amount": 123.45, "precisionMode": 0}

金额运算(Money 与 Money / 数值类型 绝对值、相反数、取模)

final a = Money.fromYuan(100); // 100元
final b = Money.fromYuan(50.50); // 50.5元

// Money ± Money
final sum = a + b; // 150.5元
final difference = a - b; // 49.5元

// Money × int/double(四舍五入到分)
final multiply1 = a * 2; // 200元
final multiply2 = b * 1.5; // 75.75元(50.5 × 1.5 = 75.75)
final multiply3 = a * 0.333; // 33.30元(100 × 0.333 = 33.3 → 3330分)

// Money ÷ int/double(四舍五入到分)
final divide1 = a / 2; // 50元
final divide2 = b / 3; // 16.83元(50.50 ÷ 3 ≈ 16.833... → 1683分)

final money = Money.fromYuan(-100.50);

// 相反数
final opposite = -money; // "100.5"

// 绝对值
final absMoney = money.abs(); // "100.5"

// 取模(100.50 元 % 3 → 1.50 元)
final mod = money.abs() % 3;// "1.50"

比较操作(== 和大小判断)

final x = Money.fromYuan(100);
final y = Money.fromCents(10000);
final z = Money.fromYuan(99.99);

// == 比较(基于分的精确比较)
print(x == y); // true(100元 == 100元)
print(x == z); // false

// 大小比较(支持 >、<、>=、<=)
print(x > z); // true
print(y >= x); // true
print(z < x); // true

// 比较方法
print(x.compareTo(z)); // 1(x > z)
print(z.compareTo(x)); // -1(z < x)
print(x.compareTo(y)); // 0(x == y)

// 辅助判断
print(x.isPositive); // true
print(z.isZero); // false
print(y.isNegative); // false

格式化与序列化

final money = Money.fromYuan(1234.56);

// 格式化输出(默认最多2位小数)
print(money.toYuanString()); // "1234.56"
print(money.toYuanString(maxDigits: 0, keepFixedDigits: false)); // "1235"(四舍五入)
print(money.toYuanString(maxDigits: 2, keepFixedDigits: false)); // "1234.56"(四舍五入)
print(money.toYuanString(maxDigits: 3, keepFixedDigits: true)); // "1234.560"(四舍五入)

// 序列化/反序列化
Map<String, dynamic> json = money.toJson(); // {amount: 1234.56, precisionMode: 0}
Money fromJson = Money.fromJson(json); // 1234.56元

精度模式配置

// 向下取整(123.456 元 → 123.45 元)
final money1 = Money.fromYuan(123.456, precisionMode: PrecisionMode.floor);
print(money1.toYuanString()); // "123.45"

// 向上取整(123.451 元 → 123.46 元)
final money2 = Money.fromYuan(123.451, precisionMode: PrecisionMode.ceil);
print(money2.toYuanString()); // "123.46"

空值与异常处理

// 空字符串 → 返回 0 元(默认)
final money1 = Money.fromString("");
print(money1.isZero); // true

// null 值 → 抛出异常(配置后)
try {
    final money2 = Money.fromYuan(null, nullValueHandling: NullValueHandling.throwError);
} catch (e) {
    print(e); // "yuan 不能为 null"
}

// 非法字符串 → 抛出格式化异常
try {
    final money3 = Money.fromString("abc123");
} catch (e) {
    print(e); // "无法解析金额字符串:abc123"
}