2012-12-16 15 views
15

Ähnlich this question nur in C# statt JavaScript. Ich konnte nichts für C# finden, währendKonvertieren einer Textfraktion in eine Dezimalzahl

Suche Ich habe ein Textfeld, das eine Menge nehmen, die später als Doppel in einer Datenbank gespeichert ist. Es ist jedoch möglich, dass einige Mengen als Zeichenkettenbruchteile eingegeben werden, z. B. 1/2 für 0,5. Ich möchte in der Lage sein, diese in Dezimal zu konvertieren, bevor sie in der Datenbank gespeichert werden (in der Lage, auch zurück zu konvertieren, wäre nett, aber nicht notwendig). Ich möchte in der Lage sein, sowohl Brüche als auch gemischte Zahlen, z.B. 2 1/2 als 2,5

Kennt jemand eine Möglichkeit, dies zu tun, gerettet?

+0

Ich würde es brechen in eine Parsing-Bibliothek, die für Gemeinsamkeiten wie Räume, die '/' und so weiter mit 'Int32.Parse' und gibt das Ergebnis aussieht. –

+0

http://www.codeproject.com/Articles/9078/Fraction-class-in-C –

Antwort

11

Versuchen Splitting es auf den Platz und zerschneiden, so etwas wie:

double FractionToDouble(string fraction) { 
    double result; 

    if(double.TryParse(fraction, out result)) { 
     return result; 
    } 

    string[] split = fraction.Split(new char[] { ' ', '/' }); 

    if(split.Length == 2 || split.Length == 3) { 
     int a, b; 

     if(int.TryParse(split[0], out a) && int.TryParse(split[1], out b)) { 
      if(split.Length == 2) { 
       return (double)a/b; 
      } 

      int c; 

      if(int.TryParse(split[2], out c)) { 
       return a + (double)b/c; 
      } 
     } 
    } 

    throw new FormatException("Not a valid fraction."); 
} 

Hey, it worked! Denken Sie daran, für eine Division durch Null, auch zu überprüfen. Sie erhalten Infinity, -Infinity oder NaN als Ergebnis.

+1

Vielen Dank! Habe das einfach in meine App implementiert und es funktioniert perfekt. –

+0

Warum brauchen wir ein Trennzeichen '' (das Leerzeichen)? @ U2744 SNOWFLAKE –

+0

Auch nicht einfach mit der folgenden Zeilenarbeit? es wird korrekt ausgegeben. Doppelfraktion = (doppelt) 1/8; –

1

Split die Zeichenfolge auf den „/“ dann die beiden Zahlen teilen.

public float FractionToDecimal(String input) 
{ 
    String[] fraction = input.Split(new[] { "/" }, StringSplitOptions.RemoveEmptyEntries); 
    if (fraction.Length != 2) 
    { 
     throw new ArgumentOutOfRangeException(); 
    } 
    Int32 numerator, denominator; 
    if (Int32.TryParse(fraction[0], out numerator) && Int32.TryParse(fraction[1], out denominator)) 
    { 
     if (denominator == 0) 
     { 
      throw new InvalidOperationException("Divide by 0 occurred"); 
     } 
     return (float)numerator/denominator; 
    } 
    throw new ArgumentException(); 
} 
7

Und hier ist noch eine weitere Lösung, aber mit einem bisschen mehr seamless an integration:

public class FractionalNumber 
{ 
    public Double Result 
    { 
     get { return this.result; } 
     private set { this.result = value; } 
    } 
    private Double result; 

    public FractionalNumber(String input) 
    { 
     this.Result = this.Parse(input); 
    } 

    private Double Parse(String input) 
    { 
     input = (input ?? String.Empty).Trim(); 
     if (String.IsNullOrEmpty(input)) 
     { 
      throw new ArgumentNullException("input"); 
     } 

     // standard decimal number (e.g. 1.125) 
     if (input.IndexOf('.') != -1 || (input.IndexOf(' ') == -1 && input.IndexOf('/') == -1 && input.IndexOf('\\') == -1)) 
     { 
      Double result; 
      if (Double.TryParse(input, out result)) 
      { 
       return result; 
      } 
     } 

     String[] parts = input.Split(new[] { ' ', '/', '\\' }, StringSplitOptions.RemoveEmptyEntries); 

     // stand-off fractional (e.g. 7/8) 
     if (input.IndexOf(' ') == -1 && parts.Length == 2) 
     { 
      Double num, den; 
      if (Double.TryParse(parts[0], out num) && Double.TryParse(parts[1], out den)) 
      { 
       return num/den; 
      } 
     } 

     // Number and fraction (e.g. 2 1/2) 
     if (parts.Length == 3) 
     { 
      Double whole, num, den; 
      if (Double.TryParse(parts[0], out whole) && Double.TryParse(parts[1], out num) && Double.TryParse(parts[2], out den)) 
      { 
       return whole + (num/den); 
      } 
     } 

     // Bogus/unable to parse 
     return Double.NaN; 
    } 

    public override string ToString() 
    { 
     return this.Result.ToString(); 
    } 

    public static implicit operator Double(FractionalNumber number) 
    { 
     return number.Result; 
    } 
} 

Und weil es dem impliziten Operator implementiert, kann sie einfach durch verwendet werden:

Double number = new FractionalNumber("3 1/2"); 

Alles, was kann nicht analysiert werden, gibt die Double-Konstante Double.NaN zurück. Ohne auf eine Liste möglicher Eingaben zu kommen, funktionierte das mit einigen Grundlagen. Fühlen Sie sich frei, die Klasse an Ihre Bedürfnisse anzupassen.

-2

funktioniert für mich.

+0

Der Compiler kann dies tun, weil das numerische Literale sind, und das '/' bildet einen mathematischen Ausdruck. '(Dezimal)" 1/7 "wird kläglich scheitern. – BradleyDotNET

+0

Das stimmt. Ich habe nur "Text" in Textfraktion ignoriert, ich entschuldige mich. Führen Sie zuerst die Funktion "fracthtodouble" von einem anderen Benutzer aus, ändern Sie sie jedoch so, dass sie in Dezimalzahlen geteilt wird. –

Verwandte Themen