Peter Fischer
Dieser Artikel befasst sich damit, wie mittels AppleScript Zahlen gerundet werden können. Um eines gleich vorweg zu nehmen: Die vorhandene Rundungsfunktion der Standard Additions bietet nur sehr unzureichende Möglichkeiten an.
Hier der Auszug aus dem Befehlsverzeichnis:
round: Round number to integer
round real -- the number to round
[rounding
up/down/toward zero/to nearest/as taught in school]
-- the rounding direction; if omitted, rounds to
nearest. to nearest rounds .5 cases to the nearest
even integer in order to decrease cumulative errors. To always
round .5 away from zero, use as taught in school.
Result: integer -- the rounded value
Hier die einzelnen Möglichkeiten:
set x to 23.4
round x
--> 23
set y to 23.5
round y
--> 24
Mit dem Parameter 'rounding' kann man die Rundungsrichtung beeinflussen.
set x to 23.4
round x rounding up
--> 24
set x to 23.7
round x rounding down
--> 23
set x to 23.92
round x rounding toward zero
--> 23
set x to 23.5
round x rounding to nearest
--> 24
set x to 0.5
round x rounding as taught in school
--> 1
Wie man schon dem Befehlsverzeichnis entnehmen kann, wird das Ergebnis immer eine Ganzzahl sein. Was ist aber, wenn man Nachkomma-Stellen runden muss?
Hier wird die Sache schon wesentlich schwieriger.
Im AppleScript-Forum beschrieb Juegi eine sehr einfache Möglichkeit:
set x to 125.955
(round (x * 100)) / 100
Ergebnis: 125.96
Zunächst werden 2 Nachkommastellen durch die Multiplikation mit 100 'entfernt' und dann durch die Division wieder hergestellt.
Hier hat man keinen Einfluss auf die Rundungsrichtung und die Dezimalstellen werden mit Punkt statt mit Komma getrennt.
Das Komma bekommt man, wenn man die Zahl in einen Textwert umwandelt:
set x to 125.955
((round (x * 100)) / 100) as text
Ergebnis: "125,96"
Eine weitere Methode wäre, die Zahl zu zerlegen und den Teil vor und nach dem Komma getrennt zu behandeln.
set x to 125.987
set y to x div 1
set x to x + 0.005
set z to (x mod 1) div 0.01
set z to z / 100
set Summe to y + z
Bei dieser Version kommen wir ohne den Befehl 'round' aus. Die eigentliche Rundung findet in der dritten Zeile statt.
Aber der Reihe nach:
Die erste Zeile ist noch klar - hier steht nur unsere ungerundete Zahl. In der zweiten Zeile wird der Teil vor dem Komma in die Variable y verfrachtet.
x div 1 ist eine Division, bei der nur Ganzzahlen als Ergebnis geliefert werden. Die Nachkommastellen fallen hier weg.
In der dritten Zeile wird die dritte Nachkommastelle unserer ursprünglichen Zahl erhöht. Ab einer 5 an der dritten Nachkommastelle wird so automatisch die zweite Nachkommastelle ebenfalls höher. Es findet also eine Aufrundung statt.
Jetzt werden die Nachkommastellen behandelt:
set z to x mod 1
So werden sie ermittelt. Ergebnis: 0.992
Also 0.987 + 0.005. Wir hatten x ja schon erhöht. Da wir aber nur zwei Stellen wollen brauchen wir noch den Ausdruck set z to x div 0.01
Ergebnis: 99
Zusammengefasst ergibt es unsere vierte Zeile:
set z to (x mod 1) div 0.01
Und da wir nicht 99 brauchen, sondern 0.99 folgt noch eine Division durch 100.
Jetzt werden die beiden Teile wieder zusammengesetzt.
Sie werden sich jetzt fragen, warum man es so kompliziert machen soll, wenn es doch wesentlich einfacher auch geht (siehe erstes Beispiel). Nun, das zweite Beispiel werden wir gleich noch brauchen. Beide Methoden haben nämlich einen entscheidenden Schönheitsfehler. Mit höheren Zahlen funktionieren sie nicht.
AppleScript steigt nämlich bei höheren Zahlen automatisch auf die wissentschaftliche Darstellung um.
Beispiel: 12345.987 wird als 1.2345987E+4 dargestellt. Das ist natürlich für unseren Skripter-Alltag nicht unbedingt brauchbar.
set x to 1.2345987E+4
((round (x * 100)) / 100) as text
Ergebnis: "1,234599E+4"
Hier hilft uns nur ein wesentlich komplexeres Skript weiter, das so eine Zahl in einen Text umwandelt und dann entsprechend bearbeitet.
Hier ist es:
set dieZahl to 1.2345987E+4
Rundung(dieZahl)
on Rundung(dieZahl)
set dieZahl to dieZahl + 0.005 -- hier wird die
-- dritte Nachkommastelle erhöht. Ist diese
-- >= 5 erhöht sich dadurch die zweite
-- Nachkommastelle = Aufrundung
set Teil1 to TextConvert(dieZahl div 1)
set Teil2 to (dieZahl mod 1) div 0.01 -- zwei Nachkommastellen
if Teil2 < 10 then set Teil2 to ("0" & Teil2 as text) as string
set Summe to (Teil1 & "," & Teil2 as string)
return Summe
end Rundung
on TextConvert(dieZahl)
set TextZahl to dieZahl as text
if TextZahl contains "E+" then
set x to offset of "," in TextZahl
set y to offset of "+" in TextZahl
set z to offset of "E" in TextZahl
set Dezimal to ¬
characters (y - (length of TextZahl)) ¬
thru -1 of TextZahl as string as number
if x is not 0 then
set Teil1 to characters 1 thru (x - 1) of TextZahl as string
else
set Teil1 to ""
end if
set Teil2 to ¬
characters (x + 1) thru (z - 1) of TextZahl as string
set convZahl to Teil1
repeat with i from 1 to Dezimal
try
set convZahl to convZahl & character i of the Teil2
on error
set convZahl to convZahl & "0"
end try
end repeat
return convZahl
else
return TextZahl
end if
end TextConvert
Nun wünsche ich viel Spass beim Studieren des Skripts.
|