Dart/Flutter如何将分数格式字符串转换为double类型?
分数格式字符串转double用作aspectRatio的解决方案
一、分数字符串转double的实现方法
直接使用double.parse无法识别分数格式,需要先处理字符串、拆分分子分母后计算比值,具体步骤和代码如下:
- 清除字符串中的所有空格,统一格式
- 按
/分割字符串得到分子和分母的字符串 - 将分子分母转为数值后相除,同时处理格式、数值异常
代码示例:
double parseAspectRatio(String ratioStr) { // 移除所有空格,统一成无空格的分数格式 final cleanedStr = ratioStr.replaceAll(RegExp(r'\s+'), ''); // 按/分割成分子和分母部分 final parts = cleanedStr.split('/'); // 格式校验:必须是两部分 if (parts.length != 2) { throw FormatException('无效的宽高比格式:$ratioStr'); } // 转换分子分母为数值 final numerator = double.tryParse(parts[0]); final denominator = double.tryParse(parts[1]); // 数值有效性校验 if (numerator == null || denominator == null || denominator == 0) { throw FormatException('宽高比中的数值无效:$ratioStr'); } return numerator / denominator; }
调用示例:
void main() { try { print(parseAspectRatio("16/9")); // 输出 1.7777777777777777 print(parseAspectRatio("16 / 9")); // 输出 1.7777777777777777 print(parseAspectRatio("9/16")); // 输出 0.5625 print(parseAspectRatio("9 / 16")); // 输出 0.5625 } catch (e) { print(e); } }
二、更优的存储方式建议
如果可以控制存储格式,优先选择以下两种方式,比存储字符串更可靠:
- 直接存储计算后的double值:比如存储
1.7777777777777777(对应16/9),使用时直接读取赋值给aspectRatio,无需转换,效率更高,避免转换异常。 - 存储分子分母的数值结构:比如用键值对
{"width":16, "height":9}或者数组[16,9]存储,读取时直接取两个数值相除,比处理字符串更稳定,还能保留原始的宽高比例数值信息。
内容的提问来源于stack exchange,提问作者Matt Larsuma
相关产品推荐
相关产品推荐

