/* * 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); } }