Flutter公式解析插件quds_formula_parser的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

Flutter公式解析插件quds_formula_parser的使用

quds_formula_parser是一个强大的Dart包,用于解析、评估和操作各种形式的数学公式。它支持多种数据类型,包括数字、日期和自定义对象,为基于公式的计算提供了灵活的解决方案。

特性

  • 公式解析:将数学表达式从中缀转换为后缀表示法。
  • 可定制的术语:定义自定义函数、运算符和变量。
  • 数据类型支持:处理复杂的类型,如数字、日期、时间跨度和逻辑表达式。
  • 可扩展性:易于扩展库以支持自定义术语、类型和函数。

支持的类型

类别 类型 描述
数字 实数 num 和其他数值工具表示。
复数 通过 ComplexNumber 类处理复数。
布尔/逻辑 通过 BooleanWrapper 和相关逻辑类型管理布尔值。
日期和时间 日期 Date 类管理与日期相关的功能。
时间 Time 类处理时间操作。
时间跨度 QudsDuration 类表示时间跨度。
日期时间 QudsDateTime 类添加了特定的自定义处理。

更多详细信息请参考官方文档

运算符(包内定义)

类别 运算符 描述
算术运算 + 加法运算符,用于数值或字符串。
- 减法运算符,用于数值。
* 乘法运算符,用于数值。
/ 除法运算符,用于数值。
% 模运算符,用于求余数。
^ 幂运算符,用于求幂。

更多运算符请参阅官方文档

函数(包内定义)

类别 支持的函数
数学函数 Abs, Int, Floor, Ceiling, SqRt, Square, Exp, Pow, Mod, …
三角函数 Sin, Cos, Tan, Cot, Sec, Csc, ASin, ACos, ATan, ATan2, …
逻辑函数 If, And, Or, Not, XOR, IfError, RandomBool, AllTrue, …
字符串函数 Len, Lower, Upper, Trim, TrimLeft, TrimRight, Replace, …
日期和时间函数 Date, Year, Month, Day, WeekDay, Days, Now, Today, …

更多函数请参阅官方文档

安装

pubspec.yaml 文件中添加以下内容:

dependencies:
  quds_formula_parser: ^1.0.0

然后运行:

flutter pub get

使用

基本用法

以下是一个解析并评估简单公式的示例:

import 'package:quds_formula_parser/quds_formula_parser.dart';

dynamic _parseFormulaAndEvaluate(String str) {
  FormulaParser parser = FormulaParser();
  var formula = parser.parse(str);
  var supporter = FormulaInfixToPostfixConvertor(formula: formula);
  var result = supporter.evaluate();

  if (result is ValueWrapper) return result.value;
  return result;
}

void main() {
  print(_parseFormulaAndEvaluate('5 + 9 / 2')); // 输出: 9.5
}

支持并设置变量值

您可以定义自定义变量并在公式中使用它们:

import 'package:quds_formula_parser/quds_formula_parser.dart';

void _evaluatingWithVariables() {
  var provider = FormulaProvider.defaultInstance;
  FormulaParser parser = FormulaParser(provider: provider);
  provider.insertVariable(Variable(symbol: 'x', value: 0));

  String formulaStr = 'power(x,2)';
  var formula = parser.parse(formulaStr);
  var supporter = FormulaInfixToPostfixConvertor(formula: formula);

  for (int i = 0; i < 10; i++) {
    provider.setVariableValue('x', i);
    print(supporter.evaluate());
  }
}

void main() {
  _evaluatingWithVariables();
}

定义并使用自定义函数

您可以定义自定义函数并在公式中使用它们:

import 'package:quds_formula_parser/quds_formula_parser.dart';

void _parseAndEvaluateWithCustomProvider() {
  FormulaProvider provider = FormulaProvider();
  provider.identifiers.addAll([
    BracketIdentifier(),
    NamedValuesIdentifier(provider: provider),
    FunctionIdentifier(functions: [_CustomFunction()])
  ]);

  var parser = FormulaParser(provider: provider);
  provider.insertVariable(Variable(symbol: 'x', value: 0));
  var formula = parser.parse('randomize(x)');

  var supporter = FormulaInfixToPostfixConvertor(formula: formula);

  for (int i = 0; i < 10; i++) {
    provider.setVariableValue('x', i);
    print(supporter.evaluate());
  }
}

class _CustomFunction extends FunctionTerm {
  @override
  String get name => 'randomize';

  @override
  bool checkParameters(List<dynamic> parameters) => parameters.length == 1 && parameters.first is num;

  @override
  dynamic evaluate(List<dynamic> parameters) {
    return parameters.first * Random().nextInt(100);
  }
}

void main() {
  _parseAndEvaluateWithCustomProvider();
}

示例Demo

以下是一个完整的示例,展示了如何使用 quds_formula_parser 解析和评估不同类型的公式:

import 'package:quds_formula_parser/quds_formula_parser.dart';
import 'dart:io';

void main() {
  _evaluateSimpleFormulas();
  _evaluatingWithVariables();
  _parseAndEvaluateWithCustomProvider();
}

void _evaluateSimpleFormulas() {
  print('\nEvaluating simple formulas');
  _parseFormulaAndEvaluate('5 + 9 / 2'); // 9.5
  _parseFormulaAndEvaluate('6 ^ 3'); // 216
  _parseFormulaAndEvaluate('true != false'); // True
}

dynamic _parseFormulaAndEvaluate(String str) {
  FormulaParser parser = FormulaParser();
  var formula = parser.parse(str);
  if (formula.hasParsingError) {
    print('''Error of parsing: $str
Error in position: ${formula.errorParsingPosition},
Error details: ${formula.errorCode?.name}''');
  } else {
    var result = (parser..parse(str)).evaluate();
    print('$str => ${parser.formula!.formulaString}\n  => $result');
  }
}

void _evaluatingWithVariables() {
  print('\nEvaluating formula with changing variable value many times');
  FormulaParser parser = FormulaParser();
  parser.insertVariable(NamedValue(symbol: 'x', value: 0));
  String formulaStr = 'power(x,2)';
  parser.parse(formulaStr);

  Stopwatch stopwatch = Stopwatch();
  stopwatch.start();
  int times = 1000000;
  for (int i = 0; i < times; i++) {
    parser.setVariableValue('x', i);
    parser.evaluate();
  }
  stopwatch.stop();
  print(
      '$formulaStr evaluating times($times) took ${stopwatch.elapsedMilliseconds} ms');
}

void _parseAndEvaluateWithCustomProvider() {
  print('\nParsing with evaluating with custom provider');
  FormulaProvider provider = FormulaProvider();
  provider.identifiers.addAll([
    BracketIdentifier(),
    NamedValuesIdentifier(provider: provider),
  ]);
  provider.registerFunction(
      notations: ['Randomize', 'Custom.Rnd'],
      checkParameters: (params) => params.length == 1 && params.first is num,
      evaluator: (params) {
        return params.first * Random().nextInt(100);
      });

  var parser = FormulaParser(provider: provider);
  provider.setVariableValue('x', 0);
  var formula = parser.parse('randomize(x)');
  var supporter = FormulaInfixToPostfixConvertor(formula: formula);

  for (int i = 0; i < 10; i++) {
    provider.setVariableValue('x', i);
    print(supporter.evaluate());
  }
}

更多关于Flutter公式解析插件quds_formula_parser的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter公式解析插件quds_formula_parser的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 quds_formula_parser 插件的 Flutter 代码示例。quds_formula_parser 是一个强大的 Flutter 插件,用于解析和计算数学公式。

首先,确保你已经在 pubspec.yaml 文件中添加了 quds_formula_parser 依赖:

dependencies:
  flutter:
    sdk: flutter
  quds_formula_parser: ^最新版本号 # 请替换为最新版本号

然后,运行 flutter pub get 来获取依赖。

接下来是一个完整的 Flutter 应用示例,展示了如何使用 quds_formula_parser 来解析和计算数学公式:

import 'package:flutter/material.dart';
import 'package:quds_formula_parser/quds_formula_parser.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Formula Parser Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: FormulaParserDemo(),
    );
  }
}

class FormulaParserDemo extends StatefulWidget {
  @override
  _FormulaParserDemoState createState() => _FormulaParserDemoState();
}

class _FormulaParserDemoState extends State<FormulaParserDemo> {
  final TextEditingController _controller = TextEditingController();
  String _result = '';

  void _evaluateFormula() {
    try {
      final formula = _controller.text;
      final parser = FormulaParser();
      final result = parser.evaluate(formula);
      setState(() {
        _result = result.toString();
      });
    } catch (e) {
      setState(() {
        _result = 'Error: ${e.message}';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Formula Parser Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            TextField(
              controller: _controller,
              decoration: InputDecoration(
                labelText: 'Enter formula',
                border: OutlineInputBorder(),
              ),
              keyboardType: TextInputType.multiline,
              maxLines: 10,
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: _evaluateFormula,
              child: Text('Evaluate'),
            ),
            SizedBox(height: 16),
            Text(
              'Result: $_result',
              style: TextStyle(fontSize: 20),
            ),
          ],
        ),
      ),
    );
  }
}

代码解释

  1. 依赖添加: 确保在 pubspec.yaml 中添加 quds_formula_parser 依赖。

  2. 主函数main() 函数启动应用,并使用 MyApp 作为根 widget。

  3. 应用主题MyApp 类定义了一个简单的 Material 应用主题。

  4. 状态管理FormulaParserDemo 是一个有状态 widget,用于管理公式输入和结果展示。

  5. 文本输入: 使用 TextField 来接受用户输入的公式。

  6. 公式计算_evaluateFormula 方法使用 FormulaParser 来解析和计算输入的公式。如果公式有误,会捕获异常并显示错误信息。

  7. 结果展示: 使用 Text widget 显示计算结果。

使用方法

  1. 运行应用。
  2. TextField 中输入数学公式,例如 3 + 5 * 2 / (8 - 4)
  3. 点击 Evaluate 按钮,查看计算结果。

这个示例展示了如何使用 quds_formula_parser 插件来解析和计算用户输入的数学公式。你可以根据需要进一步扩展这个示例,例如添加更多的错误处理或支持更复杂的数学表达式。

回到顶部