Rash thoughts about .NET, C#, F# and Dynamics NAV.


"Every solution will only lead to new problems."

Tuesday, 13. March 2007


Betrag in Worten angeben (z.B. für einen Verrechnungsscheck)

Filed under: Navision — Steffen Forkmann at 10:02 Uhr

Will man beispielsweise einen Scheck bedrucken, so steht man vor der Problem einen Geldbetrag (z.b. 123,-) in Worten (also “Einhundertdreiundzwanzig”) angeben zu müssen. Der folgende Quellcode tut dies für Zahlen bis zu 100 Milliarden.
Die Idee dahinter ist die Ziffern der Zahl immer in Dreierblöcke zu zerlegen und dann diese Dreierblöcke als einzelne Gruppen zwischen 0 und 999 zu behandeln. Im Anschluss wird dann eine “Nachsilbe” (z.b. “tausend”) an den Block angefügt. So lassen sich auch sehr große Zahlen (die leider nur selten auf meinen Schecks stehen) leicht in Text umwandeln.

PROCEDURE GetAmountInWords @1105400001(p_Amount@1105400000 : Integer) r_Result : Text[1024]; VAR l_TempAmount@1105400001 : Text[1024]; BEGIN IF p_Amount = 0 THEN EXIT('Null'); l_TempAmount := FORMAT(p_Amount); r_Result := GetGroup(l_TempAmount,0); IF STRLEN(l_TempAmount) >= 1 THEN r_Result := GetGroup(l_TempAmount,1) + r_Result; IF STRLEN(l_TempAmount) >= 1 THEN r_Result := GetGroup(l_TempAmount,2) + r_Result; IF STRLEN(l_TempAmount) >= 1 THEN r_Result := GetGroup(l_TempAmount,3) + r_Result; IF STRLEN(l_TempAmount) >=1 THEN ERROR('Betrag wird nicht untersttzt.'); r_Result := UPPERCASE(COPYSTR(r_Result,1,1)) + COPYSTR(r_Result,2,STRLEN(r_Result)); END; PROCEDURE GetGroup @1105400003(VAR v_Text@1105400003 : Text[1024]; p_Group@1105400006 : Integer) r_Result : Text[1024]; VAR l_H@1105400000 : Text[250]; l_T@1105400001 : Text[250]; l_O@1105400002 : Text[250]; l_Value@1105400004 : Integer; l_Group@1105400005 : Text[3]; BEGIN FillGroup(v_Text); l_Group := COPYSTR(v_Text, STRLEN(v_Text)-2,STRLEN(v_Text)); EVALUATE(l_Value,COPYSTR(l_Group,1,1)); IF l_Value > 0 THEN IF l_Value = 1 THEN l_H := 'einhundert' ELSE l_H := GetDigit(l_Value) + 'hundert'; EVALUATE(l_Value,COPYSTR(l_Group,2,2)); IF (l_Value >= 10) AND (l_Value < 20) THEN l_O := GetTenToTwenty(l_Value) ELSE BEGIN EVALUATE(l_Value,COPYSTR(l_Group,2,1)); IF l_Value > 1 THEN l_T := GetTens(l_Value); EVALUATE(l_Value,COPYSTR(l_Group,3,1)); IF l_Value > 0 THEN BEGIN IF l_T = '' THEN l_O := GetDigit(l_Value) ELSE BEGIN IF l_Value = 1 THEN l_O := 'einund' ELSE l_O := GetDigit(l_Value) + 'und'; END; END; END; RemoveGroup(v_Text); r_Result := l_H + l_O + l_T; IF p_Group = 1 THEN BEGIN IF r_Result = 'eins' THEN r_Result := 'eintausend' ELSE r_Result := r_Result + 'tausend'; END; IF p_Group = 2 THEN BEGIN IF r_Result = 'eins' THEN r_Result := 'einemillion' ELSE r_Result := r_Result + 'millionen'; END; IF p_Group = 3 THEN BEGIN IF r_Result = 'eins' THEN r_Result := 'einemilliarde' ELSE r_Result := r_Result + 'milliarden'; END; END; PROCEDURE GetDigit @1105400004(p_Value@1105400000 : Integer) : Text[30]; BEGIN CASE p_Value OF 0: EXIT('null'); 1: EXIT('eins'); 2: EXIT('zwei'); 3: EXIT('drei'); 4: EXIT('vier'); 5: EXIT('fnf'); 6: EXIT('sechs'); 7: EXIT('sieben'); 8: EXIT('acht'); 9: EXIT('neun'); ELSE ERROR('%1 ist kein Einer',p_Value); END; END; PROCEDURE GetTenToTwenty @1105400005(p_Value@1105400000 : Integer) : Text[30]; BEGIN CASE p_Value OF 10: EXIT('zehn'); 11: EXIT('elf'); 12: EXIT('zwölf'); 13: EXIT('dreizehn'); 14: EXIT('vierzehn'); 15: EXIT('fünfzehn'); 16: EXIT('sechzehn'); 17: EXIT('siebzehn'); 18: EXIT('achtzehn'); 19: EXIT('neunzehn'); ELSE ERROR('%1 ist nicht zwischen 10 und 20',p_Value); END; END; PROCEDURE GetTens @1105400006(p_Value@1105400000 : Integer) : Text[30]; BEGIN CASE p_Value OF 2: EXIT('zwanzig'); 3: EXIT('dreizig'); 4: EXIT('vierzig'); 5: EXIT('fünfzig'); 6: EXIT('sechzig'); 7: EXIT('siebzig'); 8: EXIT('achtzig'); 9: EXIT('neunzig'); ELSE ERROR('%1 ist keine Zehner',p_Value); END; END; PROCEDURE FillGroup @1105400007(VAR v_String@1105400000 : Text[30]); BEGIN WHILE STRLEN(v_String) < 3 DO v_String := '0' + v_String; END; PROCEDURE RemoveGroup @1105400000(VAR v_String@1105400000 : Text[1024]); BEGIN v_String := COPYSTR(v_String,1,STRLEN(v_String) - 3); END;
Tags:

4 Comments »

  1. Nicht übel! Baue gerade einen Navision Kassenquittungsbeleg für einen unserer Kunden. Genau das hab ich gesucht. Und wo finde ich es? 🙂

    Viel Spaß im Urlaub.

    Comment by Jens — Friday, 13. June 2008 um 14:53 Uhr

  2. In der Funktion “GetTens” ist ein Tipfehler:

    “Dreizig” –> “Dreißig”

    Comment by Jens — Friday, 20. June 2008 um 11:43 Uhr

  3. Ich bin gerade über Google rein gekommen und muss sagen das ich hier bei dir genau das gefunden hab wonach ich gesucht habe.

    Auch deinen Denkansatz mit der Unterteilung in drei Blöcken finde ich sehr gut. Danke für die Lösung.

    Comment by Paul — Monday, 4. January 2010 um 6:10 Uhr

  4. Und wieder hat mir Dein Blog wertvolle Dienste erwiesen!

    Comment by Jens — Wednesday, 27. January 2010 um 16:27 Uhr

RSS feed for comments on this post. | TrackBack URI

Leave a comment

XHTML ( You can use these tags): <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> .