2017-02-12 3 views
0

Momentan arbeite ich an einem RPN-Rechner mit Winforms (C#). Ich kann Brüche wie "1/2" zum Beispiel in einem Etikett speichern. Wenn also mein Label mehrere Brüche enthält, möchte ich sie zuerst in Dezimalzahlen umwandeln, damit sie auf meinen Stapel gelegt werden. Im Folgenden finden Sie meine Methode, wie ich es machen möchte. Wenn ich zum Beispiel "1/2" und "6/3" in meinem Label habe, bekomme ich für beide Werte "2" und "2" anstelle von "0.5" und "2".C#: Regex Ersetzen Übereinstimmungen nach der Konvertierung

Irgendwelche Ideen, um das zu lösen?
Vielen Dank im Voraus!

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

Sie benötigen mehr in der 'foreach' Schleife zu tun. Wenn Sie nur den Zähler und den Nenner setzen, erhalten Sie nach der Schleife nur den letzten Wert von beiden (d. H. Ihre 6/3 = 2). –

+0

Ich werde, danke! –

Antwort

1

Dies ist, was Sie brauchen:

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(); 
    }); 
} 

Beispiel:

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

Ergebnis:

"sometext 3 sometext 2 sometext" 

EDIT

wenn Sie Code nicht oben verwenden könnte, versuchen Sie dies:

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(); 
    }); 
} 

ODER

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

Danke Mann, ich werde das versuchen! –

+0

Hallo Hussein, ich bin mir nicht sicher ob das geht. Meine Eingabe-Zeichenfolge stammt von einem Label, Form1.LabelCurrentOperation.Text, die eigentlich eine nicht-statische Eigenschaft ist –

+0

Hallo, verwenden Sie Form1.LabelCurrentOperation.Text = ReplaceFraction (Form1.LabelCurrentOperation.Text); Sie können auch ein statisches Schlüsselwort entfernen. –

Verwandte Themen