首页 > 解决方案 > 在 Dart 的数学方程式中使用字符串

问题描述

我在 Postgres 中存储了各种公式,我想在我的代码中使用这些公式。它看起来像这样:

var amount = 100;
var formula = '5/105'; // normally something I would fetch from Postgres
var total = amount * formula; // should return 4.76

有没有办法以这种方式评估字符串?

标签: dart

解决方案


据我所知,还没有为 Dart 开发的公式求解器包。(如果存在或在此帖子之后创建,我们可以将其编辑为答案。)

编辑:评论中的 Mattia 指出了math_expressions包,它看起来非常健壮且易于使用。

有一种方法可以将任意 Dart 代码作为字符串执行,但它有几个问题。A] 非常迂回曲折;B] 它成为一个巨大的安全问题;和 C] 它仅在 Dart 以 JIT 模式编译时才有效(因此在 Flutter 中,这意味着它仅适用于调试版本,而不是发布版本)。

所以答案是不幸的是,你必须自己实现它。好消息是,对于简单的 4 函数算术,这非常简单,您可以按照教程编写类似这样的计算器应用程序来了解它是如何完成的。

当然,如果您的所有公式只包含两个术语,并且它们之间有一个运算符,就像您的示例片段中那样,它会变得更加容易。您只需几行代码即可完成整个操作:

void main() {
  final amount = 100;
  final formula = '5/105';

  final pattern = RegExp(r'(\d+)([\/+*-])(\d+)');
  final match = pattern.firstMatch(formula);
  final value = process(num.parse(match[1]), match[2], num.parse(match[3]));

  final total = amount * value;
  print(total); // Prints: 4.761904761904762
}

num process(num a, String operator, num b) {
  switch (operator) {
    case '+': return a + b;
    case '-': return a - b;
    case '*': return a * b;
    case '/': return a / b;
  }

  throw ArgumentError(operator);
}

推荐阅读