दिलचस्प पोस्ट
किसी jQuery अजाक्स कॉल से सही मूल्य प्राप्त नहीं कर सकते iCloud मूल बातें और कोड नमूना ब्राउज़र में उपयोगकर्ता के लोकेल को निर्धारित करने का सर्वोत्तम तरीका कई प्रक्रियाओं के बीच परिणाम कतार साझा करना मास्टर शाखा को गिट में कैसे बदलना है, पूरी तरह से किसी अन्य शाखा से? एक पायथन स्क्रिप्ट के भीतर से UAC उन्नयन का अनुरोध करें? होम बटन की तरह काम करने के लिए वापस बटन ओवरराइड करें स्तंभ मूल्य पर आधारित पांडों में डेटाफ़्रेम पंक्ति को हटाया जा रहा है SQL डाटाबेस में प्राथमिक कुंजी के रूप में स्ट्रिंग्स जावास्क्रिप्ट में चर परिवर्तनों के लिए सुन रहा है क्यों Windows64 x86-64 पर अन्य सभी ओएस से अलग कॉलिंग सम्मेलन का उपयोग करता है? "क्रैक। एनएटी रनटाइम में आंतरिक त्रुटि" के साथ एप्लिकेशन क्रैश यूनिक्स सॉर्ट कमांड एक बहुत बड़ी फ़ाइल कैसे तय कर सकता है? कैसे डैमिज़ के लिए – पैकेट के लिए matplotlib एम्बेड करें एचटीएमएल में एक ऊर्ध्वाधर रेखा कैसे बनाएं

.NET में एक स्ट्रिंग गणित मूल्यांकनकर्ता है?

अगर मेरे पास एक मान्य गणित अभिव्यक्ति के साथ एक स्ट्रिंग है जैसे:

String s = "1 + 2 * 7"; 

क्या कोई पुस्तकालय / फ़ंक्शन में है जो .NET में निर्मित होता है जो मेरे लिए उस अभिव्यक्ति का विश्लेषण और मूल्यांकन करेगा और परिणाम वापस करेगा? इस मामले में 15

वेब के समाधान से एकत्रित समाधान ".NET में एक स्ट्रिंग गणित मूल्यांकनकर्ता है?"

आप माइक्रोसॉफ्ट स्क्रिप्ट कंट्रोल लाइब्रेरी (COM) के लिए एक संदर्भ जोड़ सकते हैं और अभिव्यक्ति का मूल्यांकन करने के लिए कोड का उपयोग कर सकते हैं। (जेस्क्रिप्ट के लिए भी काम करता है।)

 Dim sc As New MSScriptControl.ScriptControl() sc.Language = "VBScript" Dim expression As String = "1 + 2 * 7" Dim result As Double = sc.Eval(expression) 

संपादित करें – सी # संस्करण

 MSScriptControl.ScriptControl sc = new MSScriptControl.ScriptControl(); sc.Language = "VBScript"; string expression = "1 + 2 * 7"; object result = sc.Eval(expression); MessageBox.Show(result.ToString()); 

संपादित करें – स्क्रिप्ट कंट्रोल एक COM ऑब्जेक्ट है प्रोजेक्ट के "संदर्भ जोड़ें" संवाद में "COM" टैब चुनें और "माइक्रोसॉफ्ट स्क्रिप्ट कंट्रोल 1.0" तक स्क्रॉल करें और ठीक चुनें।

अजीब बात है कि इस प्रसिद्ध और पुराने प्रश्न का कोई उत्तर नहीं है जो बिल्टिन डेटाटाइल। DataTable.Compute – "चाल" का सुझाव देता है। यही पर है।

 double result = Convert.ToDouble(new DataTable().Compute("1 + 2 * 7", null)); 

निम्नलिखित अंकगणित ऑपरेटर्स अभिव्यक्तियों में समर्थित हैं:

 + (addition) - (subtraction) * (multiplication) / (division) % (modulus) 

अधिक जानकारी: अभिव्यक्ति सिंटैक्स पर डेटा DataColumn.Expressionएक्सप्रेशन

सिल्वरलाइट पर सी # पर विकसित होने वाले किसी भी व्यक्ति के लिए यह एक बहुत साफ चाल है जो मैंने अभी खोज की है कि जावास्क्रिप्ट इंजन के लिए कॉल करके एक अभिव्यक्ति के मूल्यांकन की अनुमति देता है:

 double result = (double) HtmlPage.Window.Eval("15 + 35"); 

क्या आपने http://ncalc.codeplex.com देखा है?

यह एक्स्टेंसिबल, तेज (उदाहरण के लिए अपनी कैश है) आपको कार्यान्वित / मूल्यांकन पीएएमएमआरएट इवेंट्स के साथ रनवे पर कस्टम फ़ंक्शंस और वेराइबल्स प्रदान करने में सक्षम बनाता है। उदाहरण अभिव्यक्ति जो पार्स कर सकते हैं:

 Expression e = new Expression("Round(Pow(Pi, 2) + Pow([Pi2], 2) + X, 2)"); e.Parameters["Pi2"] = new Expression("Pi * Pi"); e.Parameters["X"] = 10; e.EvaluateParameter += delegate(string name, ParameterArgs args) { if (name == "Pi") args.Result = 3.14; }; Debug.Assert(117.07 == e.Evaluate()); 

यह यूनिकोड और कई डाटा प्रकारों को भी संभालती है। यदि आप ग्रामर को बदलना चाहते हैं तो यह एक एंटरर फाइल के साथ आता है वहाँ भी एक कांटा है जो नए कार्यों को लोड करने के लिए MEF का समर्थन करता है।

असल में एक तरह का एक बनाया गया है – आप XPath नामस्थान का उपयोग कर सकते हैं! हालांकि इसकी आवश्यकता है कि आप XPath नोटेशन से पुष्टि करने के लिए स्ट्रिंग को पुन: स्वरूपित करें। मैंने साधारण अभिव्यक्तियों को संभालने के लिए इस तरह से एक विधि का उपयोग किया है:

  public static double Evaluate(string expression) { var xsltExpression = string.Format("number({0})", new Regex(@"([\+\-\*])").Replace(expression, " ${1} ") .Replace("/", " div ") .Replace("%", " mod ")); return (double)new XPathDocument (new StringReader("<r/>")) .CreateNavigator() .Evaluate(xsltExpression); } 

शुरू में मैं muparser के लिए सी # आवरण का इस्तेमाल किया यह बहुत तेज था मुझे पता है कि केवल तेज समाधान exprtk है । यदि आप अन्य समाधान की तलाश कर रहे हैं तो आप बेंचमार्क चेकआउट कर सकते हैं

लेकिन .net के मामले में आप रनटाइम पर कोड संकलित करने के लिए निर्मित समर्थन का उपयोग कर सकते हैं। विचार "टेम्पलेट" स्रोत फ़ाइल है जैसे कि एम्बेडेड संसाधन, जहां आप मूल्यांकन के लिए सूत्र को बदल सकते हैं। फिर आप इस तैयार वर्ग-स्रोत-कोड को कंपाइलर में पास करते हैं।

एक बुनियादी टेम्पलेट इस तरह दिख सकता है:

 public class CSCodeEvaler { public double EvalCode() { return last = Convert.ToDouble(%formula%); } public double last = 0; public const double pi = Math.PI; public const double e = Math.E; public double sin(double value) { return Math.Sin(value); } public double cos(double value) { return Math.Cos(value); } public double tan(double value) { return Math.Tan(value); } ... 

% सूत्र% पर गौर करें जहां अभिव्यक्ति में रखा जाएगा

क्लास CSharpCodeProvider का उपयोग संकलित करने के लिए मैं पूरी स्रोत यहां नहीं डालना चाहता हूं। लेकिन यह जवाब मदद कर सकता है:

आपके पास स्मृति विधानसभा में लोड होने के बाद आप अपनी कक्षा का एक उदाहरण बना सकते हैं और EvalCode पर कॉल कर सकते हैं।

हाल ही में मैं एमएक्सपीर्स का उपयोग कर रहा था, जो कि एनएटी और जावा के लिए गणित पार्सर पुस्तकालय है। mXparser बुनियादी फार्मूले के साथ ही बहुत फैंसी / जटिल लोगों (चर, कार्य, ऑपरेटर, चलना और पुनरावृत्ति सहित) का समर्थन करता है

https://mxparser.codeplex.com/

http://mathparser.org/

कुछ उपयोग उदाहरण:

उदाहरण 1:

 Expression e = new Expression("1+2*7 + (sin(10) - 2)/3"); double v = e.calculate(); 

उदाहरण 2:

 Argument x = new Argument("x = 5"); Expression e = new Expression("2*x+3", x); double v = e.calculate(); 

उदाहरण 3:

 Function f = new Function("f(x,y) = sin(x) / cos(y)"); Expression e = new Expression("f(pi, 2*pi) - 2", f); double v = e.calculate(); 

सादर

यदि आपको बहुत सरल चीज की आवश्यकता है तो आप DataTable उपयोग कर सकते हैं 🙂

 Dim dt As New DataTable dt.Columns.Add("A", GetType(Integer)) dt.Columns.Add("B", GetType(Integer)) dt.Columns.Add("C", GetType(Integer)) dt.Rows.Add(New Object() {12, 13, DBNull.Value}) Dim boolResult As Boolean = dt.Select("A>B-2").Length > 0 dt.Columns.Add("result", GetType(Integer), "A+B*2+ISNULL(C,0)") Dim valResult As Object = dt.Rows(0)("result") 

मैं भी जेस ( https://github.com/pieterderycke/Jace ) पर एक नज़र होगा। जेस एक उच्च प्रदर्शन गणित पार्सर और गणना इंजन है जो सभी .NET स्वादों (.NET 4.x, विंडोज फोन, विंडोज स्टोर, …) का समर्थन करता है। जेस NuGet के माध्यम से भी उपलब्ध है: https://www.nuget.org/packages/Jace

एक सरल गणित पार्सर का निर्माण करना काफी आसान है, और कोड की कुछ ही पंक्तियां आवश्यक हैं:

यह लचीला उदाहरण लें:

 class RPN { public static double Parse( Stack<string> strStk ) { if (strStk == null || strStk.Count == 0 ) { return 0; } Stack<double> numStk = new Stack<double>(); double result = 0; Func<double, double> op = null; while (strStk.Count > 0) { var s = strStk.Pop(); switch (s) { case "+": op = ( b ) => { return numStk.Pop() + b; }; break; case "-": op = ( b ) => { return numStk.Pop() - b; }; break; case "*": op = ( b ) => { return numStk.Pop() * b; }; break; case "/": op = ( b ) => { return numStk.Pop() / b; }; break; default: double.TryParse(s, NumberStyles.Any, out result); if (numStk.Count > 0) { result = op(result); } numStk.Push(result); break; } } return result; } } .... var str = " 100.5 + 300.5 - 100 * 10 / 100"; str = Regex.Replace(str, @"\s", "", RegexOptions.Multiline); Stack<string> strStk = new Stack<string>( Regex.Split(str, @"([()*+\/-])", RegexOptions.Multiline).Reverse() ); RPN.Parse(strStk); 

स्टैक के ढेर को ब्रैकेटिंग से पूर्वता सक्षम करने के लिए पर्याप्त होगा, जैसे कि रिकर्सन द्वारा संग्रहीत ब्रैकेट के बीच कुछ भी एक नया स्टैक पर रखा गया है। अंत में आप लैम्ब्दास द्वारा साफ पठनीय फैशन में गणित के संचालन का समर्थन कर सकते हैं।

अभी एक और विकल्प है कि रोज़लिन उपलब्ध है:

आप इस के लिए CodeAnalysis.CSharp.Scripting लाइब्रेरी का उपयोग कर सकते हैं।

 using Microsoft.CodeAnalysis.CSharp.Scripting; using System; namespace ExpressionParser { class Program { static void Main(string[] args) { //Demonstrate evaluating C# code var result = CSharpScript.EvaluateAsync("System.DateTime.Now.AddDays(-1) > System.DateTime.Now").Result; Console.WriteLine(result.ToString()); //Demonstrate evaluating simple expressions var result2 = CSharpScript.EvaluateAsync(" 5 * 7").Result; Console.WriteLine(result2); Console.ReadKey(); } } } 

नूग पैकेज:

 <package id="Microsoft.CodeAnalysis.Analyzers" version="1.1.0" targetFramework="net461" /> <package id="Microsoft.CodeAnalysis.Common" version="1.1.1" targetFramework="net461" /> <package id="Microsoft.CodeAnalysis.CSharp" version="1.1.1" targetFramework="net461" /> <package id="Microsoft.CodeAnalysis.CSharp.Scripting" version="1.1.1" targetFramework="net461" /> <package id="Microsoft.CodeAnalysis.Scripting" version="1.1.1" targetFramework="net461" /> <package id="Microsoft.CodeAnalysis.Scripting.Common" version="1.1.1" targetFramework="net461" /> 

मैंने कुछ साल पहले एक अभिव्यक्ति पार्सर को लागू किया था और उन्होंने इसके एक संस्करण को गीथहब और न्यूगेट: अल्बाट्रॉस । एक्सपशन में प्रकाशित किया था। इसमें निष्पादन सम्मिलित वर्ग शामिल है जो अभिव्यक्तियों के एक समूह का मूल्यांकन कर सकता है जैसे:

  • एमवी = मूल्य * मात्रा;
  • मूल्य = (बोली + पूछें) / 2;
  • बोली = 6.6;
  • पूछें .8;

यह परिपत्र संदर्भ जांच में भी बनाया गया है जो स्टैक अतिप्रवाह से बचने के लिए उपयोगी है।

फास्ट लाइटवेट एक्सप्रेशन वेल्यूलेटर

https://flee.codeplex.com

भाषा संदर्भ

  • अंकगणितीय ऑपरेटर उदाहरण: एक * 2 + बी ^ 2 – 100% 5
  • तुलनाऑपरेटर उदाहरण: एक <> 100
  • AndOrXorNotOperators उदाहरण (तार्किक): ए> 100 और नहीं बी = 100
  • शिफ्टऑपरेटर उदाहरण: 100 >> 2
  • समापन उदाहरण: "एबीसी" + "डीईएफ"
  • इंडेक्सिंग उदाहरण: arr [i + 1] + 100
  • शाब्दिक
  • कास्टिंग उदाहरण: 100 + कास्ट (ओबीजे, इंट)
  • ConditionalOperator उदाहरण: यदि (a> 100 और b> 10, "दोनों बड़ा", "कम")
  • इनओपरेटर उदाहरण (सूची): यदि (100 (200, 300, -1) में 100, "इन", "नॉन इन")
  • प्रकार पर ओवरलोड किए गए ऑपरेटर

उदाहरण :

 Imports Ciloci.Flee Imports Ciloci.Flee.CalcEngine Imports System.Math 

  Dim ec As New Ciloci.Flee.ExpressionContext Dim ex As IDynamicExpression ec.Imports.AddType(GetType(Math)) ec.Variables("a") = 10 ec.Variables("b") = 40 ex = ec.CompileDynamic("a+b") Dim evalData evalData = ex.Evaluate() Console.WriteLine(evalData) 

आउटपुट: 50

 namespace CalcExp { internal class Program { private static void Main(string[] args) { double res = Evaluate("4+5/2-1"); Console.WriteLine(res); } public static double Evaluate(string expression) { var xsltExpression = string.Format("number({0})", new Regex(@"([\+\-\*])").Replace(expression, " ${1} ") .Replace("/", " div ") .Replace("%", " mod ")); // ReSharper disable PossibleNullReferenceException return (double)new XPathDocument (new StringReader("<r/>")) .CreateNavigator() .Evaluate(xsltExpression); // ReSharper restore PossibleNullReferenceException } } }