【问题标题】:Dart: Make a calculation from a user input String including math operatorsDart:从包含数学运算符的用户输入字符串进行计算
【发布时间】:2019-02-06 00:30:15
【问题描述】:

我是 Dart 和 Flutter 的新手。有没有一种简单的方法可以将用户输入计算为像 '3+5/8 这样的字符串?当然结果应该是双重类型。感谢您的回答!

【问题讨论】:

  • 这是一个相当广泛的问题 - 最好的方法可能是自己做一些研究(有很多现有材料,如 How to evaluate a math expression given in string form),如果你在选择采取哪种方法后陷入困境:)
  • 非常感谢您的帮助和链接。当然,我有一个“手动”编码的想法。我只是好奇,如果某些东西已经以简单的方式存在。当然,我会以更深入的方式进行更多研究。是的,我可以在这里评论我的结论????

标签: string math dart flutter double


【解决方案1】:

如果您正在寻找简单的数学字符串,您可以借助一个名为

的包来计算它们

首先安装这个包。将其添加到您的项目中,然后实现此代码。

import 'dart:math';
import 'package:petitparser/petitparser.dart';

Parser buildParser() {
  final builder = ExpressionBuilder();
  builder.group()
    ..primitive((pattern('+-').optional() &
            digit().plus() &
            (char('.') & digit().plus()).optional() &
            (pattern('eE') & pattern('+-').optional() & digit().plus())
                .optional())
        .flatten('number expected')
        .trim()
        .map(num.tryParse))
    ..wrapper(
        char('(').trim(), char(')').trim(), (left, value, right) => value);
  builder.group()..prefix(char('-').trim(), (op, a) => -a);
  builder.group()..right(char('^').trim(), (a, op, b) => pow(a, b));
  builder.group()
    ..left(char('*').trim(), (a, op, b) => a * b)
    ..left(char('/').trim(), (a, op, b) => a / b);
  builder.group()
    ..left(char('+').trim(), (a, op, b) => a + b)
    ..left(char('-').trim(), (a, op, b) => a - b);
  return builder.build().end();
}

double calcString(String text) {
  final parser = buildParser();
  final input = text;
  final result = parser.parse(input);
  if (result.isSuccess)
    return result.value.toDouble();
  else
    return double.parse(text);
}

现在只需调用这个函数calcString,你就会得到所需的答案。 记住它只会在给定字符串有效时返回计算值,否则它会抛出错误。

【讨论】:

    【解决方案2】:

    我认为您正在寻找的是一个可以进行“表达式评估”的包。在 pub 网站上搜索 "expression" 会产生一些看起来很有希望的结果。

    我对这些软件包没有任何直接经验,所以我不能推荐一个。

    【讨论】:

    • 非常感谢您的评论!我现在将查看链接并深入探讨该主题!
    【解决方案3】:

    我刚刚在 Dart 中编写了 Shutting-yard 算法,问题解决了 =) 访问:https://en.wikipedia.org/wiki/Shunting-yard_algorithm

    【讨论】:

    • 您好,我知道这篇文章很旧,但我想知道您是否能够分享一个示例,因为我自己也遇到了这个问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多