[英]Flutter - Exception: type 'int' is not a subtype of type 'double'
[英]Exception caught by gesture: type '_RegExpMatch' is not a subtype of type 'double' in type cast in Flutter/Dart
我试图用 Flutter 制作一个计算器来处理 Dart 的欧姆定律和幂律。 对于上下文,V 表示电压,I 表示安培数,R 表示电阻,P 表示电功率,而圆括号中的 O 和 P 表示该方程是否用于计算欧姆或功率定律。
if (expression.contains("(V)") &&
expression.contains("(I)") &&
ohm) {
expression = equation.replaceAll("(I)", "/");
expression = expression.replaceAll("(V)", "/");
expression = expression.replaceFirst("/", "First");
expression = expression.replaceAll("/", "Second");
RegExp fir = RegExp("^[^F]*");
RegExp sec = RegExp("(?<=t)(.*?)(?=S)");
double pri = 0;
double seg = 0;
print(expression);
print(fir);
print(sec);
pri = fir.firstMatch(expression) as double;
//Exception triggers here
print(pri);
seg = sec.firstMatch(expression) as double;
print(seg);
if (seg > pri) {
expression = expression.replaceFirst(fir, seg as String);
expression = expression.replaceFirst(sec, pri as String);
}
expression = expression.replaceFirst("First", "/");
expression = expression.replaceFirst("Second", "");
print(expression);
}
在上面的代码中,我正在尝试使用正则表达式检查第二个值是否大于第一个值,其中我使用替换更改双方的数字,因此在尝试时不会触发整个考验的错误做数学。 就像下面这个例子。
4(V)8(I)
(上面的代码)
预期结果:8 / 4
但由于某种原因,它不断触发对标题的期望,并拒绝继续编写代码。 它与不想成为双重的正则表达式字符串有关,是的,但我在网上找不到任何答案。 另外,我的在线朋友不使用 Dart 编码,这让我创建了这个帐户并在这里提出问题。 🥲
如果您有任何答案和建议,请接受!
如果对我的代码有任何疑问,我很乐意回答。
您正在尝试将调用fir.firstMatch(expression)
的结果转换为double
,但fir.firstMatch(expression)
返回RegExpMatch
,这不是 dart 知道如何变成double
的东西。 但是,您可以通过从匹配中检索适当的组来获取匹配的String
值,然后从字符串中解析双精度。 可能像
val match = fir.firstMatch(expression);
val doubleAsString = match.group(0);
val pri = double.parse(doubleAsString);
这是 dart 的RegExpMatch
类的文档: https ://api.dart.dev/stable/2.17.6/dart-core/RegExpMatch-class.html
经过一段时间与一些在线朋友的头脑风暴后,我和他们找到了解决方案!
使用 matchString 来获取我想要的子字符串,就像我之前提到的示例一样,然后使用 parse 将文字数字转换为双精度字符串,我可以从字符串中获取我想要的值! 出于某种原因,JavaScript 需要做这部分逻辑而不是 Dart,因为 as 不能用 Regex 做文字值。
然后将此双精度转换回字符串,我可以使用 toString() 方法来定义数字的文字并使用 replace() 替换它们。
上面解析的代码应该是这样的:
if (expression.contains("(V)") &&
expression.contains("(I)") &&
ohm) {
expression = equation.replaceAll("(I)", "/");
expression = expression.replaceAll("(V)", "/");
expression = expression.replaceFirst("/", "First");
expression = expression.replaceAll("/", "Second");
RegExp fir = RegExp("^[^F]*");
RegExp sec = RegExp("(?<=t)(.*?)(?=S)");
double pri = 0;
double seg = 0;
pri = double.parse(fir.stringMatch(expression)!);
seg = double.parse(sec.stringMatch(expression)!);
if (seg > pri) {
expression = expression.replaceFirst(fir, seg.toString());
expression = expression.replaceFirst(sec, pri.toString());
}
expression = expression.replaceFirst("First", "/");
expression = expression.replaceFirst("Second", "");
}
请注意,在代码中,我也有感叹号,因此它可以预期为空值。 运行设置代码也需要它。
因此,代码现在按以下顺序运行:
表达式:4(V)8(I)
4/8/
4前8秒
“正则表达式逻辑”
8First4Second
8/4秒
8/4
希望这可以帮助任何遇到或将遇到与我相同的问题的人! 小心!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.