You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart/Flutter中拆分数字与度量单位字符串并转换为g/ml单位

优化Dart中单位字符串拆分与转换的实现

需求说明

需要实现方法拆分包含数字与公制单位(g、kg、l、ml)的字符串,分离数字与单位后,将非基准单位(kg、l)转换为g或ml,最终仅保留g和ml两种单位输出。当前采用多分支if-else实现,希望得到更优雅、易扩展的方案。

现有实现代码

List<String> splitString(String input) {
    input = input.replaceAll(" ", "");
    if (input.contains("ml")) {
      String number = input.replaceAll("ml", "");
      return [number, "ml"];
    } else if(input.contains("g")){
      String number = input.replaceAll("g", "");
      return [number, "g"];
    } else if(input.contains("kg")){
      String number = input.replaceAll("kg", "");
      double value = double.parse(number) * 1000;
      return [value.toStringAsFixed(2), "g"];
    } else{
      String number = input.replaceAll("l", "");
      double value = double.parse(number) * 1000;
      return [value.toStringAsFixed(2), "ml"];
    }
  }

预期示例输出

  • "22g" → ["22","g"]
  • "150 g" → ["150","g"]
  • "120ml" → ["120","ml"]
  • "2 l" → ["2000","ml"]
  • "1kg" → ["1000","g"]

优化方案

通过正则表达式精准提取数字与单位 + 映射表管理转换规则的方式实现,方案更简洁易扩展,同时避免replaceAll可能带来的误替换问题。

优化后代码

List<String> parseAndConvertUnit(String input) {
  // 清理输入:移除所有空格
  final cleanedInput = input.replaceAll(RegExp(r'\s+'), '');
  
  // 正则匹配:提取数字部分(支持整数/小数)和单位部分
  final regex = RegExp(r'^(\d+\.?\d*)(g|kg|l|ml)$');
  final match = regex.firstMatch(cleanedInput);
  
  if (match == null) {
    // 处理不符合格式的输入,可根据需求返回默认值或抛出异常
    throw ArgumentError('输入格式无效,请输入如"100g"、"2.5kg"的字符串');
  }
  
  final rawNumber = match.group(1)!;
  final originalUnit = match.group(2)!;
  
  // 单位转换规则映射:键为原单位,值为(目标单位, 转换系数)
  final unitConversion = {
    'g': ('g', 1.0),
    'kg': ('g', 1000.0),
    'ml': ('ml', 1.0),
    'l': ('ml', 1000.0),
  };
  
  final (targetUnit, coefficient) = unitConversion[originalUnit]!;
  final number = double.parse(rawNumber) * coefficient;
  
  // 保留两位小数,若为整数则自动去掉末尾的.00(可选,根据需求调整)
  final formattedNumber = number % 1 == 0 
      ? number.toInt().toString() 
      : number.toStringAsFixed(2);
  
  return [formattedNumber, targetUnit];
}

方案优势

  1. 精准提取:正则表达式确保只匹配数字+合法单位的组合,避免contains+replaceAll可能出现的误处理。
  2. 易扩展:新增单位时只需在unitConversion映射表中添加对应规则,无需修改核心逻辑。
  3. 格式灵活:支持整数和小数输入(如"1.5kg"会转换为["1500","g"])。
  4. 健壮性:增加格式校验,对无效输入抛出明确错误,便于排查问题。

测试验证

调用优化后的方法,输出符合预期:

print(parseAndConvertUnit("22g")); // ["22", "g"]
print(parseAndConvertUnit("150 g")); // ["150", "g"]
print(parseAndConvertUnit("120ml")); // ["120", "ml"]
print(parseAndConvertUnit("2 l")); // ["2000", "ml"]
print(parseAndConvertUnit("1kg")); // ["1000", "g"]
print(parseAndConvertUnit("0.5kg")); // ["500", "g"]
print(parseAndConvertUnit("1.25l")); // ["1250.00", "ml"]

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 09:46:26