© serviceprofessionalgmbh

Werden Zahlen in Druckausgaben benötigt, empfiehlt es sich der besseren Lesbarkeit wegen, diese entsprechend aufzubereiten. Das Beispiel zeigt ein Programm, welches parameter-abhängig die Druckaufbereitungszeichen einfügt oder entfernt.

Dezimalbrüche in REXX haben als Dezimalzeichen einen Punkt. Druckaufbereitete Zahlen sollen als Dezimalzeichen ein Komma erhalten und den Punkt als Tausender-Trennzeichen benutzen.

Bei der Reformatierung werden alle Tausender-Trennzeichen entfernt und das Dezimalzeichen Komma gegebenenfalls wieder durch Punkt ersetzt.

/* REXX * NUMFORM
   erg = function("12345.67","D")   >> 12.345,67
   erg = function("12.345,67","R")  >> 12345.67
*/
parse source . TYP .
if TYP = "FUNCTION" then arg WERT,ART,DMY
else arg WERT ART DMY
WERT = strip(WERT)
if ART <> "R" then ART = "D"
select
   when ART = "R" then call format_rechenfaehig
   when ART = "D" then call format_druckaufbereitet
   otherwise nop
end
return NEW

format_rechenfaehig:
   parse var WERT INTEGER "," DECIMAL
   NEW = space(translate(INTEGER," ","."),0)
   if DECIMAL <> "" then NEW = NEW"."DECIMAL
return NEW

format_druckaufbereitet:
   parse var WERT INTEGER "." DECIMAL
   INTEGER = reverse(INTEGER)
   NEW=""
   do I = 1 to length(INTEGER)
      NEW = NEW !! substr(INTEGER,I,1)
      if I // 3 = 0 then do
         NEW = NEW"."
      end
   end
   NEW = reverse(NEW)
   if left(NEW,1) = "." then NEW = substr(NEW,2)
   if DECIMAL <> "" then NEW = NEW","DECIMAL
return NEW

© gerardschildberger@newsgroup

Das folgende Beispiel zeigt einmal mehr die Macht von REXX.

Original comment:
I wrote this little ditty some time ago, and it has no limits on the lenth of the number [i.e., doesn't rely on DIGITS()], supports leading signs, supports leading/trailing/imbedded blanks (as REXX numbers can have), supports exponentated numbers, and also supports any character(s) for the comma [i.e., as some European countries use periods (.) instead of commas (,)], and also can format strings like $123456.78 ---> $123,456.78 and other such monitary numbers. The routine if very fast. Format: xxx=comma(yyy) --or--: xxx=comma(yyy,newcommacharacter)

/* REXX * NUMFORM
   PARM1 = ZU FORMATIERENDER WERT
   PARM2 = DEZIMAL-TRENNZEICHEN
*/
PARSE ARG _, C;
IF C=='' THEN C=".";
DEZP = SUBSTR(".,.",POS(C,".,.")+1,1)
PARSE VAR _ _ (DEZP) DEZ
N=_'.9'
DO J=VERIFY(N,1234567890,,VERIFY(N,1234567890.,'M'))-4 TO ,
   VERIFY(N,987654321,"M") BY -3
   _=INSERT(C,_,J)
END
IF DEZ <> "" THEN _ = _ !! DEZP !! DEZ
RETURN _


/* REXX * DRIVER
*/
SAY NUMFORM("7677652.435432",",")
SAY NUMFORM("76776524354,32",".")
EXIT
zurück zu Hilfen im Alltag