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]; }
方案优势
- 精准提取:正则表达式确保只匹配数字+合法单位的组合,避免
contains+replaceAll可能出现的误处理。 - 易扩展:新增单位时只需在
unitConversion映射表中添加对应规则,无需修改核心逻辑。 - 格式灵活:支持整数和小数输入(如
"1.5kg"会转换为["1500","g"])。 - 健壮性:增加格式校验,对无效输入抛出明确错误,便于排查问题。
测试验证
调用优化后的方法,输出符合预期:
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
相关产品推荐
相关产品推荐

