用途:定义一套纯 Dart 值对象核心,让金额、物理量与时间只有一个规范存储形式,只在展示或导出时转换,从而支持用户随意切换货币符号、单位制与地区而不破坏已存数据,并让“各部分之和等于整体”成为结构性保证。
主要能力:Money 由整数最小单位与 Currency 组成,禁止使用 double/num;按货币真实 ISO-4217 指数推导 minorPerMajor(JPY/VND 为 0,USD/EUR 为 2,KWD/BHD/OMR 为 3),不硬编码 100;未知币种返回类型化失败而非默认两位;同一聚合只用一种货币,禁止跨币种算术;所有金额除法走唯一的 allocate(amount, weights) 整数最大余额法原语,保证拆分后各部分精确加总回原额;总量派生而非存储;关系用稳定 id 链接而非内嵌副本;物理量存整数 SI 基本单位,时间存 UTC DateTime;解析使用 package:decimal,仅在边界按显式 RoundingMode 舍入一次;时间读取类注入 package:clock 的 Clock,禁止 DateTime.now()。核心仅依赖 decimal 与 clock,不含 flutter、intl、dart:io。
使用方式:值对象放在 lib/core/ 纯基础层;输入前须先把数字与分隔符规范化为 ASCII,再用 Decimal 解析并乘以 currency.minorPerMajor 舍入一次;金额拆分统一调用 allocate(),参考文档给出验证向量,如 allocate(1001,[1,1,1]) 等于 [334,334,333];提交 PR 前运行 scripts/check-money-violations.sh 与 scripts/verify-core.sh。
适用场景与限制:适合需要精确金额、税率与小费分摊、单位换算的应用领域建模。格式化与本地化属于展示层,不在此核心;XML 资料未提供具体价格、收费、性能或平台支持信息。