myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns
» Datenschutzerklärung
» Impressum

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Gemeinschaft » .NET-Komponenten und C#-Snippets » (Deutsche) sprechende Zahlen
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

(Deutsche) sprechende Zahlen

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
emuuu
myCSharp.de-Mitglied

avatar-4078.jpg


Dabei seit: 04.02.2011
Beiträge: 221
Entwicklungsumgebung: VS 2017


emuuu ist offline

(Deutsche) sprechende Zahlen

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Übersetzung von Integer in sprechende Zahlen

Habe mal aus Langeweile einen Codesnippet aus einer alten Vorlesung in C# übersetzt.
Dieses kann Integerwerte in ausgeschriebene Zahlen, bis 10^27, (Einhundertfünfundfünfzig) übersetzen.

C#-Code:
public static class SprechendeZahlen
    {
        private static string[] kleiner20 = new string[] { "null", "ein", "zwei", "drei", "vier", "fünf", "sechs", "sieben", "acht", "neun", "zehn", "elf", "zwölf", "dreizehn", "vierzhen", "fünfzehn", "sechszehn", "siebzehn", "achtzehn", "neunzehn" };
        private static string[] zehner = new string[] { "null", "zehn", "zwanzig", "dreißig", "vierzig", "fünfzig", "sechzig", "siebzig", "achtzig", "neunzig" };
        private static string[] singular = new string[] { "s", "tausend", "e Million", "e Milliarde", "e Billion", "e Billiarde", "e Trillion", "e Trilliade" };
        private static string[] plural = new string[] { "", "tausend", "Millionen", "Milliarden", "Billionen", "Billiarden", "Trillionen", "Trilliaden", "Quadrillionen", "Quadrilliarden" };

        public static string GetZahlenname(int zahl)
        {
            if (zahl == 0)
                return "Null";
            else if (zahl < 1 || zahl >=  Math.Pow(plural.Length, 28))
                return "InvalidNumber";
            List<int> gruppe = new List<int>();
            int i = -1, stellen;
            while (zahl>0)
            {
                stellen = zahl % 1000;
                zahl = zahl / 1000;
                i++;
                gruppe.Add(stellen);
            }

            StringBuilder sb = new StringBuilder();
            while (i>=0)
            {
                sb.Append(GetHunderter(gruppe[i], singular[i], plural[i]));
                i--;
            }
            return sb.ToString();
        }

        private static string GetHunderter(int zahl, string singular, string plural)
        {
            if (zahl == 0)
                return "";
            else if (zahl == 1)
                return "ein" + singular;
            StringBuilder sb = new StringBuilder();

            var h = zahl / 100;
            var r = zahl % 100;
            if (h > 0)
                sb.Append(kleiner20[h] + "hundert");
            if (r>0)
            {
                if (r == 1)
                    sb.Append("eins");
                else if (r < 20)
                    sb.Append(kleiner20[r]);
                else
                {
                    var z = r / 10;
                    var rr = r % 10;
                    if (rr > 0)
                        sb.Append(kleiner20[rr]);
                    if (rr > 0 && z > 0)
                        sb.Append("und");
                    if (z > 0)
                        sb.Append(zehner[z]);
                }
            }
            return sb.ToString()+plural;
        }
    }

Hier im  Forum und sonstigem Netz gibts dazu zahlreiche Lösungen, finde obige aber eleganter/übersichtlicher und vor allem im Bereich sämtlicher im Alltag ausgeschriebener Zahlen

MfG
emuuu


Sprechende Zahlen

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von emuuu am 01.08.2017 12:38.

27.07.2017 22:19 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
p!lle
myCSharp.de-Mitglied

avatar-3556.jpg


Dabei seit: 22.02.2007
Beiträge: 979
Entwicklungsumgebung: Visual Studio (Community) 2017


p!lle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ganz nice, ein paar Punkte lassen sich allerdings noch optimieren:
  • 0 wird nicht unterstützt
  • negative Zahlen werden nicht unterstützt -> uint nutzen?
  • "Billionen", "Billiarden", "Trillionen", "Trilliaden", "Quadrillionen", "Quadrilliarden" kann aus dem plural-Array raus
28.07.2017 12:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
emuuu
myCSharp.de-Mitglied

avatar-4078.jpg


Dabei seit: 04.02.2011
Beiträge: 221
Entwicklungsumgebung: VS 2017

Themenstarter Thema begonnen von emuuu

emuuu ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von p!lle:
Ganz nice, ein paar Punkte lassen sich allerdings noch optimieren:
  • 0 wird nicht unterstützt
  • negative Zahlen werden nicht unterstützt -> uint nutzen?
  • "Billionen", "Billiarden", "Trillionen", "Trilliaden", "Quadrillionen", "Quadrilliarden" kann aus dem plural-Array raus

Edit 1: Unterstützung von 0 hinzugefügt.
To Go:
uint ist zwar gut, allerdings muss man dann jedes mal aus einem int-Value ein uint machen, was ich blöd finde, da man meistens mit int arbeitet und somit in den meisten fällen casten muss. Und ich caste lieber in der Ausnahme als in der Regel.

Unabhängig vom MaxValue von int will ich das ganze für double umsetzen.
Sprich der Wert wird in ganze Zahlen und Nachkommastellen aufgeteilt. Muss nur schauen wie ich das umsetze:
Da eigentlich nur buchhalterische Zahlen ausgeschrieben werden würde ich dem ganzen ein Math.Round(x, 2) vorschalten und die Nachkommastelle auch als ganze Zahl übersetzen (nicht wissenschaftliche Aussprache).
Laut Duden wäre die korrekte Notation dafür " (KOMMA) ".
01.08.2017 12:46 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 12.643
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Allgemein gefällt mir der Ansatz von  https://github.com/Humanizr/Humanizer mit Fluent Code deutlich besser.
01.08.2017 12:52 Beiträge des Benutzers | zu Buddylist hinzufügen
emuuu
myCSharp.de-Mitglied

avatar-4078.jpg


Dabei seit: 04.02.2011
Beiträge: 221
Entwicklungsumgebung: VS 2017

Themenstarter Thema begonnen von emuuu

emuuu ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Abt:
Allgemein gefällt mir der Ansatz von  https://github.com/Humanizr/Humanizer mit Fluent Code deutlich besser.

 GermanNumberToWordsConverter

Finde ich den von von mir geposteten Ansatz wesentlich eleganter weil der, theoretisch viel besser nach oben skaliert (neue Dimension =>stringarray erweitern)

Mir ging es mit dem Post vor allem um die Effizienz der Umsetzung.
01.08.2017 13:08 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.453
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo emuuu,

die Unterstützung für negative Zahlen wäre doch ganz einfach zu realisieren. Falls die Zahl negativ ist, könnte man "Minus " + GetZahlenname (-zahl) zurückgeben. Nur für int.MinValue müsste man noch eine Sonderbehandlung einbauen, weil -int.MinValue außerhalb des Wertebereichs eins int liegt (es würde jedoch innerhalb des Wertebereichs eines longs und erst recht Decimals liegen).

Generell könntest du überlegen, ob du den Wertebereich nicht gleich auf long und/oder sogar Decimal ausweitest. Das löst zwar das MinValue Problem nicht, aber zumindest die Erweiterung auf long kostet sehr wenig und behebt eine unnötige Einschränkung.

Zitat:
würde ich dem ganzen ein Math.Round(x, 2) vorschalten und die Nachkommastelle auch als ganze Zahl übersetzen (nicht wissenschaftliche Aussprache).

Ich würde den Benutzer bestimmen lassen, wie viele Nachkommastellen er ausgegeben haben will und auch wie er die Nachkommastellen ausgegeben haben will, also als Zahl oder Ziffernfolge.

herbivore
05.08.2017 06:37 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als ein Jahr.
Der letzte Beitrag ist älter als ein Jahr.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 22.05.2019 12:38