2017-02-12 16 views
0

現在、私はWinforms(C#)を使用したRPN電卓で作業しています。私はラベルに "1/2"のような分数を保存することができます。だから、私のラベルにいくつかの分数が含まれている場合、それらを最初に10進数に変換して、それらをスタックに入れます。あなたが私の方法を私がそれをやりたいと思う方法の下に見つけることができます。しかし、私のラベルに "1/2"や "6/3"というラベルがあると、両方の値が "0.5"と "2"ではなく "2"と "2"になります。C#:Regex変換後の正規表現の置換

これを解決する方法はありますか?
事前に感謝します!

private void SearchforFrac() 
{ 
    string pattern = @"(\d+)(/)(\d+)"; 
    decimal new1 = 0; 
    int numerator = 0; 
    int denominator = 1; 

    foreach (Match match in Regex.Matches(labelCurrentOperation.Text, pattern, RegexOptions.IgnoreCase)) 
    { 
     numerator = int.Parse(match.Groups[1].Value); 
     denominator = int.Parse(match.Groups[3].Value); 
    } 
    new1 = (decimal)numerator/(decimal)denominator; 
    String res = Convert.ToString(new1); 

    Regex rgx = new Regex(pattern); 
    labelCurrentOperation.Text = rgx.Replace(labelCurrentOperation.Text, res);   
} 
+0

あなたは 'foreach'ループ内でより多くを行う必要があります。分子と分母を設定しただけでループの後に、それらの両方の最後の値(つまり6/3 = 2)が得られます。 –

+0

私は、ありがとう! –

答えて

1

これは、何が必要です:

public static string ReplaceFraction(string inputString) 
{ 
    string pattern = @"(\d+)(/)(\d+)"; 
    return System.Text.RegularExpressions.Regex.Replace(inputString, pattern, (match) => 
    { 
     decimal numerator = int.Parse(match.Groups[1].Value); 
     decimal denominator = int.Parse(match.Groups[3].Value); 
     return (numerator/denominator).ToString(); 
    }); 
} 

例:

string Result = ReplaceFraction("sometext 9/3 sometext 4/2 sometext"); 

結果:

"sometext 3 sometext 2 sometext" 

はEDIT

あなたは上記のコードを使用することができなかった場合

、これを試してみてください。

private void SearchforFrac() 
{ 
    string pattern = @"(\d+)(/)(\d+)"; 
    labelCurrentOperation.Text = System.Text.RegularExpressions.Regex.Replace(labelCurrentOperation.Text, pattern,delegate (System.Text.RegularExpressions.Match match) 
    { 
     decimal numerator = int.Parse(match.Groups[1].Value); 
     decimal denominator = int.Parse(match.Groups[3].Value); 
     return (numerator/denominator).ToString(); 
    }); 
} 

OR

private void SearchforFrac() 
{ 
    string pattern = @"(\d+)(/)(\d+)"; 
    this.labelCurrentOperation.Text = System.Text.RegularExpressions.Regex.Replace(this.labelCurrentOperation.Text, pattern, evaluator); 
} 
private string evaluator(System.Text.RegularExpressions.Match match) 
{ 
    decimal numerator = int.Parse(match.Groups[1].Value); 
    decimal denominator = int.Parse(match.Groups[3].Value); 
    return (numerator/denominator).ToString(); 
} 
+0

ありがとう、私はこれを試してみましょう! –

+0

こんにちはフセイン、私はこれが動作するかどうかは分かりません。私の入力文字列は、実際には非静的なプロパティであるForm1.LabelCurrentOperation.Textというラベルから来ます。 –

+0

こんにちは、Form1.LabelCurrentOperation.Text = ReplaceFraction(Form1.LabelCurrentOperation.Text);を使用します。静的キーワードを削除することもできます。 –