■102011 / inTopicNo.5) |
Re[3]: 電卓プログラムでの四則演算 |
□投稿者/ WebSurfer (2698回)-(2023/05/26(Fri) 18:41:37)
|
■No102002 (goz さん) に返信
DataTable.Compute メソッドを使って起算する際ユーザーが * を省略することがあるので、
ユーザーが入力した計算対象の文字列に * を追加する、例えば、
1. "2(3+4)" ⇒ "2*(3+4)"
2. "(1+2)(3+4)" ⇒ "(1+2)*(3+4)"
3. "(1+2)3" ⇒ "(1+2)*3"
のようにしたいのですよね?
であれば、正規表現を勉強して使えるようになりましょう。正規表現を使う以外に現実的な
解決策はないと思います。
上の 2 については、質問者さんがやっているように String.Replace メソッドでもなんとか
なるかもしれませんが、1, 3 はお手上げです。
2 の場合でも、) と ( の間に空白を許すとそこで破綻します。
具体例は、Regex.Replace メソッドを使うと、
Replace(String, String, String)
https://learn.microsoft.com/ja-jp/dotnet/api/system.text.regularexpressions.regex.replace?view=netframework-4.8#system-text-regularexpressions-regex-replace(system-string-system-string-system-string)
以下のようにできます。
using System;
using System.Data;
using System.Text.RegularExpressions;
namespace ConsoleAppDataTableCompute
{
internal class Program
{
static void Main(string[] args)
{
var table = new DataTable();
string s1 = Rewrite("2 (3 + 4)");
string s2 = Rewrite("(1 + 2) (3 + 4)");
string s3 = Rewrite("(1 + 2) 3");
object result1 = table.Compute(s1, "");
object result2 = table.Compute(s2, "");
object result3 = table.Compute(s3, "");
Console.WriteLine($"{s1} = {result1}");
Console.WriteLine($"{s2} = {result2}");
Console.WriteLine($"{s3} = {result3}");
}
static string Rewrite(string input)
{
string output = Regex.Replace(input, @"\)\s*\(", ")*(");
output = Regex.Replace(output, @"(?<val>\d+)\s*\(", @"${val}*(");
output = Regex.Replace(output, @"\)\s*(?<val>\d+)", @")*${val}");
return output;
}
}
}
結果は:
2*(3 + 4) = 14
(1 + 2)*(3 + 4) = 21
(1 + 2)*3 = 9
.NET の正規表現については、自分的には以下の記事が非常に分かりやすかったので紹介
しておきます。タイトルに「ASP.NET の・・・」とついてますが .NET 全般に有効です。
ASP.NET の正規表現
https://learn.microsoft.com/ja-jp/previous-versions/dotnet/articles/ms972966(v=msdn.10)?redirectedfrom=MSDN
上のサンプルコードの、* とか + は「量指定子」、\d とか \s は「定義済みの Set
Metacharacters」、?<val> とか ${val} は「高度なトピック」のセクションを見てく
ださい。
|
|