MBrendecke icon

Bruch

MBrendecke | PRO | 07/09/19 10:06:09 PM UTC | 0 ⭐ | 457 👁️ | Never ⏰ | []
C# |

2.63 KB

|

None

|

0 👍

/

0 👎

/*
 * Bruch.cs
 * Version: 1.0.100719.0836
 *
 * History:
 * - Formatstring angepasst.
 * - Fehler bei operator /(Bruch a, long b) korrigiert.
*/
 
using System;
using System.Globalization;
 
namespace MySocratesNote {
  public struct Bruch : IFormattable {
    public long Zähler { get; private set; }
    public long Nenner { get; private set; }
 
    public Bruch(long zähler, long nenner) {
      if (nenner == 0)
        throw new ArgumentException("Der Nenner darf nicht 0 sein.", nameof(nenner));
 
      Zähler = zähler;
      Nenner = nenner;
    }
 
    public Bruch(long zähler) : this(zähler, 1) { }
 
    public Bruch Kehrwert => new Bruch(Nenner, Zähler);
 
    public Bruch Kürzen => this / Ggt(Zähler, Nenner);
 
    public static Bruch operator *(Bruch a, Bruch b) => new Bruch(a.Zähler * b.Zähler, a.Nenner * b.Nenner);
 
    public static Bruch operator *(Bruch a, long b) => new Bruch(a.Zähler * b, a.Nenner * b);
 
    public static Bruch operator /(Bruch a, Bruch b) => a * b.Kehrwert;
 
    public static Bruch operator /(Bruch a, long b) => a * new Bruch(1, b);
 
    public static Bruch operator +(Bruch a, Bruch b) {
      if (a.Nenner != b.Nenner) {        
        return new Bruch((a.Zähler * b.Nenner) + (b.Zähler * a.Nenner), a.Nenner * b.Nenner);
      } else {
        return new Bruch(a.Zähler + b.Zähler, a.Nenner);
      }
    }
 
    public static Bruch operator -(Bruch a, Bruch b) {
      if (a.Nenner != b.Nenner) {
        return new Bruch((a.Zähler * b.Nenner) - (b.Zähler * a.Nenner), a.Nenner * b.Nenner);
      } else {
        return new Bruch(a.Zähler - b.Zähler, a.Nenner);
      }
    }
 
    private long Ggt(long a, long b) {
      if (b == 0)
        return a;
      else
        return Ggt(b, a % b);
    }
 
    public string ToString(string format, IFormatProvider formatProvider) {
      if (String.IsNullOrEmpty(format))
        format = "G";
 
      if (formatProvider == null)
        formatProvider = CultureInfo.CurrentCulture;
 
      switch (format.ToUpperInvariant()) {
        case "G":
        case "B":
          return $"{Zähler.ToString(formatProvider)} / {Nenner.ToString(formatProvider)}";
        case "Z":
          return Zähler.ToString(formatProvider);
        case "N":
          return Nenner.ToString(formatProvider);
        default:
          throw new FormatException($"Das {format} Format wird nicht unterstützt.");
      }
    }
 
    public string ToString(string format) => this.ToString(format, CultureInfo.CurrentCulture);
 
    public override string ToString() => this.ToString("G", CultureInfo.CurrentCulture);
  }
}

Comments