Quds Formula Parser
Quds Formula Parser is a powerful Dart package designed to parse, evaluate, and manipulate mathematical formulas in various forms. It supports diverse data types, including numbers, dates, and custom objects, offering a flexible solution for formula-based calculations.
Features
-
Formula Parsing: Convert mathematical expressions from infix to postfix notation.
-
Customizable Terms: Define custom functions, operators, and variables.
-
Data Types Support: Handle complex data types such as numbers, dates, durations, and logical expressions.
-
Extensible: Easily extend the library to support custom terms, types, and functions.
Supported Types
Category | Type | Description |
---|---|---|
Numbers | Real Numbers | Represented by num and other numerical utilities. |
Complex Numbers | Handling of complex numbers through the ComplexNumber class. |
|
Boolean/Logic | Boolean values are managed through BooleanWrapper and related logic types. |
|
Date and Time | Date | Managed by the Date class for handling date-related functionalities. |
Time | Handled by the Time class for time manipulations. |
|
Duration | Represented by the QudsDuration class for handling time spans. |
|
DateTime | QudsDateTime class adds specific custom handling for datetime operations. |
|
Math and Geometry | 2D Point | Handled by the Point2D class, which represents a point in a two-dimensional space. |
3D Point | Handled by the Point3D class for three-dimensional geometry. |
|
Strings | Strings | Managed by StringWrapper and Strings classes for string manipulation. |
Iterables | Iterable | Represents a collection of elements that can be iterated over, such as lists or sets. |
Science | Atom | Scientific data types related to chemistry and atomic structure represented by the Atom class. |
Operators (Defined in the Package):
Category | Operator | Description |
---|---|---|
Arithmetic | + |
Addition operator for numerical values or strings. |
- |
Subtraction operator for numerical values. | |
* |
Multiplication operator for numerical values. | |
/ |
Division operator for numerical values. | |
% |
Modulus operator to find the remainder of division. | |
^ |
Exponentiation operator for raising numbers to a power. | |
Comparison | == |
Equality operator to compare two values. |
!= |
Inequality operator to check if two values are different. | |
> |
Greater than operator for numerical comparison. | |
< |
Less than operator for numerical comparison. | |
>= |
Greater than or equal to operator for numerical comparison. | |
<= |
Less than or equal to operator for numerical comparison. |
Functions (Defined in the Package):
Category | Supported Functions |
---|---|
Mathematical Functions | Abs , Int , Floor , Ceiling , SqRt , Square , Exp , Pow , Mod , GCD , LCM , Factorial , Fibonacci , IsPrime , IsEven , IsOdd , Clamp |
Trigonometric Functions | Sin , Cos , Tan , Cot , Sec , Csc , ASin , ACos , ATan , ATan2 |
Logical Functions | If , And , Or , Not , XOR , IfError , RandomBool , AllTrue , AnyTrue , AllFalse , AnyFalse |
String Functions | Len , Lower , Upper , Trim , TrimLeft , TrimRight , Replace , Contains , StartsWith , EndsWith , Concat , ToStr |
Date & Time Functions | Date , Year , Month , Day , WeekDay , Days , Now , Today , Hour , Minute , Second |
Geometry Functions | Point , Point.X , Point.Y , Point.Z , Distance , Hypotenuse |
Statistical Functions | Avg , Product , Count , Max , Min , Median , Sum , Variance , StDev , Mode , Permutations , Combinations |
Iterable Functions | List , Reverse |
Set Operations | Set , Union , Intersect , Difference |
Atom Functions | Atom , Atom.Name , Atom.Symbol , Atom.Number , Atom.Weight , Atom.BoilingPoint , Atom.MeltingPoint , Atom.Density , Atom.IonizationEnergy , Atom.Row , Atom.Column , Atom.EarthCrust , Atom.DiscoveryYear , Atom.GroupNumber |
Core Functions | Type , ValueType , IsNumber , IsReal , IsComplex , IsPoint , IsPoint2D , IsPoint3D , IsDate , IsTime , IsDateTime , IsDuration , IsBool , IsFraction , IsAtom , IsText |
Installation
Add the following to your pubspec.yaml
file:
dependencies:
quds_formula_parser: ^1.0.0
Then, run:
flutter pub get
Usage
Basic Usage
Here's an example of parsing and evaluating a simple formula:
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() {
_evaluateSimpleFormulas();
}
Supporting and setting variable values
You can also define custom variable and use it with custom value in your formulas:
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);
Stopwatch stopwatch = Stopwatch();
stopwatch.start();
int times = 1000000;
for (int i = 0; i < times; i++) {
provider.setVariableValue('x', i);
supporter.evaluate();
}
stopwatch.stop();
print(
'$formulaStr evaluating times($times) took ${stopwatch.elapsedMilliseconds} ms');
}
void main() {
_evaluatingWithVariables();
}
Defining custom function with using it
You can also define custom function and use it in your formulas:
import 'package:quds_formula_parser/quds_formula_parser.dart';
void _parseAndEvaluateWithCustomProvider() {
// Prepare the terms provider
FormulaProvider provider = FormulaProvider();
provider.identifiers.addAll([
BracketIdentifier(),
NamedValuesIdentifier(provider: provider),
FunctionIdentifier(functions: [_CustomFunction()])
]);
// Prepare the parser
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());
}
}
void main() {
_parseAndEvaluateWithCustomProvider();
}
Example
See the example directory for a full example on how to use the package.
Contributions
Contributions are welcome! Feel free to submit pull requests or open issues on our GitHub page.
License
This package is licensed under the MIT License. See the LICENSE file for more information.
Libraries
- quds_formula_parser
- Quds Formula Parser is a powerful Dart package designed to parse, evaluate, and manipulate mathematical formulas in various forms. It supports diverse data types, including numbers, dates, and custom objects, offering a flexible solution for formula-based calculations.