Flutter公式解析插件quds_formula_parser的使用
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
更多关于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),
),
],
),
),
);
}
}
代码解释
-
依赖添加: 确保在
pubspec.yaml
中添加quds_formula_parser
依赖。 -
主函数:
main()
函数启动应用,并使用MyApp
作为根 widget。 -
应用主题:
MyApp
类定义了一个简单的 Material 应用主题。 -
状态管理:
FormulaParserDemo
是一个有状态 widget,用于管理公式输入和结果展示。 -
文本输入: 使用
TextField
来接受用户输入的公式。 -
公式计算:
_evaluateFormula
方法使用FormulaParser
来解析和计算输入的公式。如果公式有误,会捕获异常并显示错误信息。 -
结果展示: 使用
Text
widget 显示计算结果。
使用方法
- 运行应用。
- 在
TextField
中输入数学公式,例如3 + 5 * 2 / (8 - 4)
。 - 点击
Evaluate
按钮,查看计算结果。
这个示例展示了如何使用 quds_formula_parser
插件来解析和计算用户输入的数学公式。你可以根据需要进一步扩展这个示例,例如添加更多的错误处理或支持更复杂的数学表达式。