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

使用num.parse解析时,如何实现int与double互转?有无更优方案?

优化方案

你的代码逻辑是可行的,但可以通过更现代的Dart语法提升可读性和扩展性,下面是几种更优的实现方式:

方式一:使用模式匹配(Dart 3.0+)

利用Dart 3.0引入的switch模式匹配替换原有的if-else判断,代码结构更清晰,后续如果需要支持更多num子类也更容易扩展:

void main() {
  print(foo<int>('1'));
  print(foo<double>('1.0'));
  print(foo<double>('1'));
  print(foo<int>('1.0'));
}

T foo<T extends num>(String s) {
  final res = num.parse(s);
  return switch (T) {
    int => res.toInt() as T,
    double => res.toDouble() as T,
    _ => throw UnsupportedError('不支持的类型 $T'),
  };
}

方式二:直接调用对应类型的解析方法(严格解析场景)

如果你的需求是严格解析(比如输入'1.0'作为int类型时抛出错误,而非自动截断),可以直接调用int.parse或double.parse,这种方式更直接:

T foo<T extends num>(String s) {
  if (T == int) return int.parse(s) as T;
  if (T == double) return double.parse(s) as T;
  throw UnsupportedError('不支持的类型 $T');
}

注意:这种方式和你原代码的行为不同——原代码会将'1.0'截断为1(int类型),而此方式会抛出FormatException。

原代码的轻量化优化

如果不想使用模式匹配,也可以把原代码的三目运算符拆分为更清晰的if-else结构,提升可读性:

T foo<T extends num>(String s) {
  final res = num.parse(s);
  if (T == double) {
    return res.toDouble() as T;
  } else if (T == int) {
    return res.toInt() as T;
  } else {
    throw UnsupportedError('不支持的类型 $T');
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 13:25:20