/*
* 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