From 123ac7d789577de7eeb21597d29dd20473fdc392 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Niklas=20Sch=C3=A4fer?= Date: Wed, 13 Nov 2019 08:35:15 +0100 Subject: [PATCH 1/9] Create build-master.yml --- .github/workflows/build-master.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/workflows/build-master.yml diff --git a/.github/workflows/build-master.yml b/.github/workflows/build-master.yml new file mode 100644 index 0000000..3d1397c --- /dev/null +++ b/.github/workflows/build-master.yml @@ -0,0 +1,23 @@ +name: .NET Core + +on: + push: + branches: + - master + +jobs: + build: + + runs-on: windows-latest + + steps: + - uses: actions/checkout@v1 + - name: Setup .NET Core + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 2.2.108 + - name: Run Tests + run: dotnet test + - name: Build with dotnet + run: dotnet build --configuration Release + From 037af74d482a1a0ea43ad2f1d74ec917e2a4c7b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Niklas=20Sch=C3=A4fer?= Date: Wed, 13 Nov 2019 21:18:54 +0100 Subject: [PATCH 2/9] Create dotnetcore.yml --- .github/workflows/dotnetcore.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/dotnetcore.yml diff --git a/.github/workflows/dotnetcore.yml b/.github/workflows/dotnetcore.yml new file mode 100644 index 0000000..6aba16c --- /dev/null +++ b/.github/workflows/dotnetcore.yml @@ -0,0 +1,22 @@ +name: .NET Core + +on: + push: + branches: + - master + +jobs: + build: + + runs-on: windows-latest + + steps: + - uses: actions/checkout@v1 + - name: Setup .NET Core + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 2.2.108 + - name: Run Tests + run: dotnet test + - name: Build with dotnet + run: dotnet build --configuration Release From f1b0553622c2bc6b86646e844d7830fc8cf91d6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Niklas=20Sch=C3=A4fer?= Date: Wed, 13 Nov 2019 21:20:16 +0100 Subject: [PATCH 3/9] Update and rename build-master.yml to build-dev.yml --- .github/workflows/{build-master.yml => build-dev.yml} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename .github/workflows/{build-master.yml => build-dev.yml} (95%) diff --git a/.github/workflows/build-master.yml b/.github/workflows/build-dev.yml similarity index 95% rename from .github/workflows/build-master.yml rename to .github/workflows/build-dev.yml index 3d1397c..f91ee74 100644 --- a/.github/workflows/build-master.yml +++ b/.github/workflows/build-dev.yml @@ -3,7 +3,7 @@ name: .NET Core on: push: branches: - - master + - develop jobs: build: From ce5eefb34170151b9044d10fdec0413c25268f73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Niklas=20Sch=C3=A4fer?= Date: Wed, 13 Nov 2019 21:28:11 +0100 Subject: [PATCH 4/9] Delete dotnetcore.yml --- .github/workflows/dotnetcore.yml | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 .github/workflows/dotnetcore.yml diff --git a/.github/workflows/dotnetcore.yml b/.github/workflows/dotnetcore.yml deleted file mode 100644 index 6aba16c..0000000 --- a/.github/workflows/dotnetcore.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: .NET Core - -on: - push: - branches: - - master - -jobs: - build: - - runs-on: windows-latest - - steps: - - uses: actions/checkout@v1 - - name: Setup .NET Core - uses: actions/setup-dotnet@v1 - with: - dotnet-version: 2.2.108 - - name: Run Tests - run: dotnet test - - name: Build with dotnet - run: dotnet build --configuration Release From 11b0a29f999d8dd867cae4eeb223f95eefa37d1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Niklas=20Sch=C3=A4fer?= Date: Wed, 13 Nov 2019 21:34:06 +0100 Subject: [PATCH 5/9] Create build-branch-TermRewriting.yml --- .../workflows/build-branch-TermRewriting.yml | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/build-branch-TermRewriting.yml diff --git a/.github/workflows/build-branch-TermRewriting.yml b/.github/workflows/build-branch-TermRewriting.yml new file mode 100644 index 0000000..2cf64b6 --- /dev/null +++ b/.github/workflows/build-branch-TermRewriting.yml @@ -0,0 +1,22 @@ +name: branch TermRewriting + +on: + push: + branches: + - feature/TermRewriting + +jobs: + build: + + runs-on: windows-latest + + steps: + - uses: actions/checkout@v1 + - name: Setup .NET Core + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 2.2.108 + - name: Run Tests + run: dotnet test + - name: Build with dotnet + run: dotnet build --configuration Release From b440c0e469aedec957e2665cc4b72718b461dcfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Niklas=20Sch=C3=A4fer?= Date: Wed, 13 Nov 2019 21:39:49 +0100 Subject: [PATCH 6/9] Update build-branch-TermRewriting.yml --- .github/workflows/build-branch-TermRewriting.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-branch-TermRewriting.yml b/.github/workflows/build-branch-TermRewriting.yml index 2cf64b6..7f0deec 100644 --- a/.github/workflows/build-branch-TermRewriting.yml +++ b/.github/workflows/build-branch-TermRewriting.yml @@ -19,4 +19,4 @@ jobs: - name: Run Tests run: dotnet test - name: Build with dotnet - run: dotnet build --configuration Release + run: dotnet build .\ThinkSharp.FormulaParser\ThinkSharp.FormulaParser.csproj --configuration Release From 6d407a74606a02ea5c820d054677eb79a38ef3f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Niklas=20Sch=C3=A4fer?= Date: Wed, 13 Nov 2019 21:40:16 +0100 Subject: [PATCH 7/9] Update build-dev.yml --- .github/workflows/build-dev.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-dev.yml b/.github/workflows/build-dev.yml index f91ee74..51d6721 100644 --- a/.github/workflows/build-dev.yml +++ b/.github/workflows/build-dev.yml @@ -19,5 +19,5 @@ jobs: - name: Run Tests run: dotnet test - name: Build with dotnet - run: dotnet build --configuration Release + run: dotnet build .\ThinkSharp.FormulaParser\ThinkSharp.FormulaParser.csproj --configuration Release From 29882868e7728c4f695e5d54d7fcbe874f8e0e93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Niklas=20Sch=C3=A4fer?= Date: Sun, 31 May 2020 18:26:30 +0200 Subject: [PATCH 8/9] Update README.md --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 19afe4d..e6925f8 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ var variables = new Dictionary { ["x"] = 2.0 }; var result2 = parser.Evaluate("1+x", variables).Value; // result2 = 3.0 // Usage of functions -var result3 = parser.Evaluate("1+min(3,4)").Value; // result2 = 4.0 +var result3 = parser.Evaluate("1+min(3,4)").Value; // result3 = 4.0 // Handle errors var parsingResult = parser.Evaluate("2*?"); @@ -93,17 +93,18 @@ var parser = FormulaParser { // functions.RemoveAll() for removing all default functions // functions.Remove("sum") for removing function by name - // define function with 2 to n number of parameters (typeof(nums) = double[]) - functions.Add("product", nums => nums.Aggregate((p1, p2) => p1 * p2)); - // define functions with specified number of parameters (1-5 parameters are supported) + // define functions with certain number of parameters (1-5 parameters are supported) functions.Add("celsiusToFarenheit", celsius => celsius * 1.8 + 32); functions.Add("fahrenheitToCelsius", fahrenheit => (fahrenheit - 32) * 5 / 9); functions.Add("p1_plus_p2_plus_p3", (p1, p2, p3) => p1 + p2 + p3); + + // define function with 2 to n number of parameters (typeof(nums) = double[]) + functions.Add("product", nums => nums.Aggregate((p1, p2) => p1 * p2)); }).Build(); var poolTemperatureInCelsius = parser.Evaluate("celsiusToFarenheit(fahrenheitToCelsius(30))").Value; // poolTemperatureInCelsius = 30 -var result2 = parser.Evaluate("product(2, 2, 2, 2, 2, 2, 2)").Value; // result2 = 2^6 = 128 +var result2 = parser.Evaluate("product(2, 2, 2, 2, 2, 2)").Value; // result2 = 2^6 = 128 var result3 = parser.Evaluate("p1_plus_p2_plus_p3(1, 2, 3)").Value; // result3 = 6 string error1 = parser.Evaluate("celsiusToFarenheit(1, 2)").Error; // column 0: There is no function 'celsiusToFarenheit' that takes 2 argument(s). From 41fb0a385fa40bf53ca18b5ab97f74f752823c18 Mon Sep 17 00:00:00 2001 From: JanDotNet Date: Fri, 5 Apr 2024 16:29:18 +0200 Subject: [PATCH 9/9] fixed bug: decimal numbers has been parsed, based on the OS's culture. --- .../FormularParser.NumberFormats.Test.cs | 16 +++++++++++++++- .../ThinkSharp.FormulaParser.Test.csproj | 9 +++++---- .../ANTLR/AntlrToAstNodesGrammerTreeVisitor.cs | 9 +++++---- .../ThinkSharp.FormulaParser.csproj | 15 ++++++++++----- 4 files changed, 35 insertions(+), 14 deletions(-) diff --git a/ThinkSharp.FormulaParser.Test.Core/FormularParser.NumberFormats.Test.cs b/ThinkSharp.FormulaParser.Test.Core/FormularParser.NumberFormats.Test.cs index 93d1ec2..fb620ff 100644 --- a/ThinkSharp.FormulaParser.Test.Core/FormularParser.NumberFormats.Test.cs +++ b/ThinkSharp.FormulaParser.Test.Core/FormularParser.NumberFormats.Test.cs @@ -1,8 +1,10 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; using System.Text; +using System.Threading; using System.Threading.Tasks; using ThinkSharp.FormulaParsing.Ast.Nodes; using ThinkSharp.FormulaParsing.Ast.Visitors; @@ -50,7 +52,19 @@ public void TestDecimalNotation() Assert.AreEqual(202.0, parser.Evaluate("0d101 + 101").Value); } - [TestMethod] + [TestMethod] + public void TestDifferentCultures() + { + var parser = FormulaParser.Create(); + + Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE"); + Assert.AreEqual(0.1, parser.Evaluate("0.1").Value); + + Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); + Assert.AreEqual(0.1, parser.Evaluate("0.1").Value); + } + + [TestMethod] [Ignore] public void TestScientificNotation() { diff --git a/ThinkSharp.FormulaParser.Test.Core/ThinkSharp.FormulaParser.Test.csproj b/ThinkSharp.FormulaParser.Test.Core/ThinkSharp.FormulaParser.Test.csproj index 232823b..4648127 100644 --- a/ThinkSharp.FormulaParser.Test.Core/ThinkSharp.FormulaParser.Test.csproj +++ b/ThinkSharp.FormulaParser.Test.Core/ThinkSharp.FormulaParser.Test.csproj @@ -1,9 +1,10 @@  - netcoreapp2.0 + net7.0 false + true ThinkSharp.FormulaParser.Test.Core @@ -11,9 +12,9 @@ - - - + + + diff --git a/ThinkSharp.FormulaParser/ANTLR/AntlrToAstNodesGrammerTreeVisitor.cs b/ThinkSharp.FormulaParser/ANTLR/AntlrToAstNodesGrammerTreeVisitor.cs index 6f0a097..381423f 100644 --- a/ThinkSharp.FormulaParser/ANTLR/AntlrToAstNodesGrammerTreeVisitor.cs +++ b/ThinkSharp.FormulaParser/ANTLR/AntlrToAstNodesGrammerTreeVisitor.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Globalization; using Antlr4.Runtime.Misc; using ThinkSharp.FormulaParsing.Ast.Nodes; @@ -131,7 +132,7 @@ public override Node VisitAtom([NotNull] FormulaGrammerParser.AtomContext contex // //var pow = new PowerNode(new IntegerNode("10", 10), exponentNumber); // //return new BinaryOperatorNode(BinaryOperator.BySymbol("*"), baseNumber, exponentNumber); - // return new DecimalNode(scientificNumber, double.Parse(scientificNumber)); + // return new DecimalNode(scientificNumber, double.Parse(scientificNumber.Parse)); //} public override Node VisitPrefixedIntNumber([NotNull] FormulaGrammerParser.PrefixedIntNumberContext context) @@ -154,7 +155,7 @@ public override Node VisitPrefixedBinNumber([NotNull] FormulaGrammerParser.Prefi public override Node VisitPrefixedDecNumber([NotNull] FormulaGrammerParser.PrefixedDecNumberContext context) { var token = context.PREFIX_DEC_NUMBER().Symbol.Text; - return new DecimalNode(double.Parse(token.Substring(2))); + return new DecimalNode(double.Parse(token.Substring(2), CultureInfo.InvariantCulture)); } public override Node VisitPrefixedHexNumber([NotNull] FormulaGrammerParser.PrefixedHexNumberContext context) @@ -182,13 +183,13 @@ public override Node VisitPrefixedOctNumber([NotNull] FormulaGrammerParser.Prefi public override Node VisitDecimalNumber([NotNull] FormulaGrammerParser.DecimalNumberContext context) { var token = context.DECIMAL_NUMBER().Symbol.Text; - return new DecimalNode(double.Parse(token)); + return new DecimalNode(double.Parse(token, CultureInfo.InvariantCulture)); } public override Node VisitIntgerNumber([NotNull] FormulaGrammerParser.IntgerNumberContext context) { var token = context.INTEGER_NUMBER().Symbol.Text; - return new IntegerNode(NumberFormat.Dec, long.Parse(token)); + return new IntegerNode(NumberFormat.Dec, long.Parse(token, CultureInfo.InvariantCulture)); } public override Node VisitVariable([NotNull] FormulaGrammerParser.VariableContext context) diff --git a/ThinkSharp.FormulaParser/ThinkSharp.FormulaParser.csproj b/ThinkSharp.FormulaParser/ThinkSharp.FormulaParser.csproj index 3b48427..b556f14 100644 --- a/ThinkSharp.FormulaParser/ThinkSharp.FormulaParser.csproj +++ b/ThinkSharp.FormulaParser/ThinkSharp.FormulaParser.csproj @@ -8,16 +8,17 @@ Jan-Niklas Schäfer ThinkSharp A formula parser with fluent API that allows parsing and evaluation of mathematically formulas. Features: functions, constants, variables, scientific numbers, focus on customization and flexibility. - © 2020 Jan-Niklas Schäfer - 0.9.0.0 - 0.9.0.0 + © 2020-2024 Jan-Niklas Schäfer + 0.10.0.0 + 0.10.0.0 LICENSE.txt Removed term rewriting functionality (has been moved to its own project) - + 0.10.0 Bugfix: decimal parsing should not depend on OS Culture https://github.com/JanDotNet/ThinkSharp.FormulaParser true - 0.9.0 + 0.10.0 + README.md @@ -32,6 +33,10 @@ True + + True + \ +