C# :: Aufgabe #315
1 Lösung
Zahlen in Wörtern ausdrücken
Anfänger - C#
von Gisbert5020
- 30.04.2020 um 15:17 Uhr
Schreiben Sie ein Programm, das Zahlen von 0 bis 99 in Wörtern fasst.
Zusatzaufgabe : Erweitern Sie das Programm von 0 bis 1000.
Zusatzaufgabe : Erweitern Sie das Programm von 0 bis 1000.
Lösungen:
Program.cs
C#-Code
GermanNumberConverter.cs
C#-Code
using System;
namespace ConsoleGermanNumberConverter
{
class Program
{
static void Main(string[] args)
{
for (int i = 0; i <= 1000; i++)
{
string num = GermanNumberConverter.Translate(i);
Console.WriteLine($"{i, 4} - {num}");
}
Console.ReadLine();
}
}
}
GermanNumberConverter.cs
using System.Collections.Generic;
using System.Linq;
namespace ConsoleGermanNumberConverter
{
class GermanNumberConverter
{
const string minus = "minus ";
static readonly Dictionary<int, string> constants = new Dictionary<int, string>()
{
//{0, "null" },
{1, "eins" },
{2, "zwei" },
{3, "drei" },
{4, "vier" },
{5, "fünf" },
{6, "sechs" },
{7, "sieben" },
{8, "acht" },
{9, "neun" },
{10, "zehn" },
{11, "elf" },
{12, "zwölf" },
{13, "dreizehn" },
{14, "vierzehn" },
{15, "fünfzehn" },
{16, "sechszehn" },
{17, "siebzehn" },
{18, "achtzehn" },
{19, "neunzehn" },
{20, "zwanzig" },
{21, "einundzwanzig" },
{31, "einunddreizig" },
{41, "einundvierzig" },
{51, "einundfünfzig" },
{61, "einundsechzig" },
{70, "siebzig" },
{71, "einundsiebzig" },
{81, "einundachtzig" },
{91, "einundneunzig" },
{100, "einhundert" },
{1000, "eintausend" },
{1000000, "einemillion" },
{1000000000, "einemilliarde" },
};
static readonly TranslationRule[] RuleSet =
{
new TranslationRule() { RangeFrom = 2, RangeTo = 999, Factor = 1000000000, Suffix = "milliarden" },
new TranslationRule() { RangeFrom = 2, RangeTo = 999, Factor = 1000000,Suffix = "millionen" },
new TranslationRule() { RangeFrom = 2, RangeTo = 999, Factor = 1000, Suffix = "tausend" },
new TranslationRule() { RangeFrom = 2, RangeTo = 9, Factor = 100, Suffix = "hundert" },
new TranslationRule() { RangeFrom = 3, RangeTo = 9, Factor = 10, Suffix = "zig" }
};
public static string Translate(int n)
{
if (n == 0)
{
return "null";
}
else if (n < 0)
{
return minus + TranslatePositiveNumber(-n);
}
else
{
return TranslatePositiveNumber(n);
}
}
private static string TranslatePositiveNumber(int n)
{
List<NumberElement> elements = new List<NumberElement>();
string s = Translate(n, ref elements);
var ret = elements.Where(a => !string.IsNullOrWhiteSpace(a.Value)).ToArray();
string value = "";
for (int i = 0; i < ret.Length - 2; i++)
{
value += ret[i];
}
if (ret.Length >= 2)
{
NumberElement secondLast = ret[ret.Length - 2];
NumberElement last = ret[ret.Length - 1];
if (!secondLast.Value.StartsWith("ein") && secondLast.Value.EndsWith("zig") && last.Constant >= 1 && last.Constant <= 9)
{
value += last.Value + "und" + secondLast.Value;
}
else
{
value += secondLast.Value + last.Value;
}
}
else
{
value = ret.FirstOrDefault();
}
return value;
}
private static string Translate(int n, ref List<NumberElement> list)
{
if (constants.Keys.Contains(n))
{
list.Add(new NumberElement() { Value = constants[n], Constant = n });
return constants[n];
}
string result = "";
int v = n;
foreach (var rule in RuleSet)
{
NumberElement element;
int sub;
if (!rule.Assign(n, out element, out sub))
{
return "";
}
v -= sub;
result += element;
list.Add(element);
if (sub > 0)
{
break;
}
}
if (v > 0)
{
result += Translate(v, ref list);
}
return result;
}
private class TranslationRule
{
public int RangeFrom { get; set; }
public int RangeTo { get; set; }
public int Factor { get; set; }
public string Suffix { get; set; }
public bool Assign(int n, out NumberElement element, out int sub)
{
element = (NumberElement)"";
sub = 0;
int value = n / Factor;
sub = value * Factor;
if (value == 0)
{
return true;
}
if (constants.ContainsKey(sub))
{
element.Value = constants[sub];
element.Constant = sub;
return true;
}
else if (value < RangeFrom || value > RangeTo)
{
return false;
}
if (!constants.ContainsKey(value))
{
element.Value = TranslatePositiveNumber(value);
if (string.IsNullOrWhiteSpace(element))
{
return false;
}
element.Value += Suffix;
}
else
{
element.Value = constants[value] + Suffix;
}
return true;
}
}
private class NumberElement
{
public string Value { get; set; }
public int Constant { get; set; }
public static implicit operator string(NumberElement v)
{
return v.Value;
}
public static explicit operator NumberElement(string v)
{
return new NumberElement() { Value = v };
}
public override string ToString()
{
return Value;
}
}
}
}
