/// 金额换算工具:契约传输整数分(amountCents),UI 展示以元。 /// DTO 层保持整数分不换算(开发计划 §4.3);本工具供 UI 层(T2-14)使用。 library; /// 整数分 → 元展示字符串。整元不带小数("128"), /// 非整元固定两位("128.50")。负数入参非法(契约金额非负)。 String formatCentsAsYuan(int cents) { if (cents < 0) { throw ArgumentError.value(cents, 'cents', '金额不得为负'); } final yuan = cents ~/ 100; final remainder = cents % 100; if (remainder == 0) return '$yuan'; return '$yuan.${remainder.toString().padLeft(2, '0')}'; } /// 元输入串 → 整数分。接受整数或最多两位小数("12"、"12.5"、"12.50"); /// 空白、非法字符、超两位小数、负数返回 null(表单层据此报「金额格式不正确」)。 int? parseYuanToCents(String input) { final trimmed = input.trim(); final match = RegExp(r'^(\d+)(?:\.(\d{1,2}))?$').firstMatch(trimmed); if (match == null) return null; final yuan = int.parse(match.group(1)!); final fractional = match.group(2); final cents = switch (fractional) { null => 0, _ => int.parse(fractional.padRight(2, '0')), }; return yuan * 100 + cents; }