| Das R-BASIC Handbuch im HTML-Format |
| Startseite > R-BASIC > Das R-BASIC Handbuch im HTML-Format |
|
|
R-BASIC - Spezielle ThemenEinfach unter PC/GEOS programmierenAutor: Rainer BettstellerHTML-Version: Mütze - Hinweise & Fehler an |
1. Formatierung von ZahlenUm einzustellen, wie R-BASIC Zahlen darstellt, haben Sie drei Möglichkeiten:
^1.1 Standard-ZahlenformateFür viele Zwecke reichen die Standard-Zahlenformate aus, die mit der Funktion SetNumberFormat eingestellt werden können. Intern belegt SetNumberFormat die globale Variable numberFormat mit vorgegebenen Werten.SetNumberFormatStellt das Zahlenformat für die Anzeige von Zahlen ein. Die verfügbaren Zahlenformate finden Sie in der Tabelle auf der nächsten Seite.
Beispiele: |
SetNumberFormat NF_NORMAL SetNumberFormat (NF_SCI_4) ' Klammern sind OK |
|
Weitere Beispiele finden Sie im Abschnitt 1.3 (Komplexe Beispiele)
(2) Durch die feste Struktur der Zahl (als Text) gut als Ausgangspunkt für eigene Zahlenformate geeignet. (3) Wissenschaftliche Darstellung heißt, dass der Exponent immer durch 3 teilbar ist.
Für Fortgeschrittene:Sie können SetNumberFormat auch benutzen um eine Variable des Typs NumberFormatStruct für die spätere Verwendung vorzubereiten.
^1.2 Die numberFormat VariableWenn Sie mit den Standard Zahlenformaten nicht auskommen, haben Sie mit Hilfe der globalen Variablen numberFormat weitgehende Kontrolle darüber, wie R-BASIC Zahlen ausgibt. Das betrifft sowohl die PRINT-Anweisung, als auch die Konvertierungsfunktionen Str$() und StrLocal$(). In diesem Abschnitt finden Sie ausführliche Erläuterungen zur numberFormat-Variablen und dem dazugehörigen Typ NumberFormatStruct, damit Sie in der Lage sind, die numberFormat-Variable manuell Ihren Bedürfnissen anzupassen.^1.2.1 ÜberblickDie globale Variable numberFormat ist vom Typ NumberFormatStruct. In diesem Abschnitt erhalten Sie einen Überblick, eine nähere Beschreibung der Felder finden Sie in den folgenden Unterkapiteln dieses Abschnitts. |
STRUCT NumberFormatStruct minDigits, maxDigits, digitMode AS Integer highLimit, lowLimit AS Integer plusSign AS Integer exponentMode AS Integer preChars, addChars AS String[7] formatFlags AS Word END STRUCT |
Alle Felder lassen sich lesen und schreiben.
Bedeutung der einzelnen Felder:
Beispiel: Immer eine Nachkommastelle erzwingen: |
numberFormat.digitMode = DM_FRAC_DIGITS
' Nur Nachkommastellen zählen
numberFormat.minDigits = 1 ' Mindestens eine Nachkommastelle
numberFormat.maxDigits = 1 ' höchstens eine Nachkommastelle
numberFormat.highLimit = 15 ' Nur im Notfall (zu viele Stellen)
' ins Exponentialformat wechseln
numberFormat.formatFlags = FF_NO_EXP_LOW
' Zahlen nahe Null: runden
|
|
Wegen der vielen Möglichkeiten, die Sie hier haben, ist das korrekte Belegen der Systemvariablen numberFormat unter Umständen unübersichtlich. Deswegen gibt es im Ordner Beispiel\Mathe zwei Beispielprogramme.
Das Beispiel 'Zahlenformatierung' gibt ein paar Zahlen in verschiedenen Standardformaten aus. Das Beispiel 'NumberFormat Einstellungen' erlaubt das interaktive Belegen der Systemvariablen numberFormat und Sie können so direkt die Auswirkungen von bestimmten Einstellungen sehen.
1.2.2 Einstellen der StellenzahlDie Felder minDigits, maxDigits, digitMode bestimmen, mit wie vielen Stellen Zahlen dargestellt werden.
Es macht keinen Unterschied, ob die Ziffern vor oder nach dem Komma stehen, so wie es keinen Unterschied macht, ob man 1,230 km oder 1230 m schreibt. Beispiele:
digitMode = DM_FRAC_DIGITS ( nur Nachkommastellen zählen) Es werden immer Nachkommastellen geschrieben. Maximal maxDigits, mindestens jedoch minDigits Nachkommastellen. Beispiele:
digitMode = DM_VALID_DIGITS (gültige Stellen zählen) Führende Nullen werden ignoriert, die Zählung der Stellenzahl beginnt bei der ersten von Null verschiedenen Ziffer, egal wo das Komma steht. Dies ist auch die Art und Weise, wie wir intuitiv Zahlen aufschreiben. Die Körpergröße einer Person wird als 1,73 m oder als 173 cm angegeben, niemals als 173,00 cm, weil die Angabe auf 1/10 mm hier sinnlos ist. Die Länge einer Brücke können wir auf den Meter genau angeben, indem wir entweder 0.346 km oder 346 m schreiben.
Beispiel: immer 2 Nachkommastellen
Beispiele:
Die Standardeinstellungen von R-BASIC sind:
Beispiele:
Hinweis: Wenn das Feld digitMode auf DM_FRAC_DIGITS oder DM_ALL_DIGITS steht, können Sie mit dem Flag FF_NO_EXP_LOW im Feld formatFlags bewirken, dass bei Zahlen unter 1 nicht in den Exponentialmodus gewechselt wird, sondern stattdessen Null angezeigt wird. Das ist z.B. sinnvoll für Währungsangaben, wenn sich durch Rundungsfehler ein Betrag von beispielsweise 0.00000000001 Euro ergibt. Im Kapitel 1.2.3 finden Sie entsprechende Beispiele.
1.2.3 Zahlen in ExponentialdarstellungLässt sich eine Zahl nicht mehr sinnvoll in "normaler" Darstellung ausdrücken, wechselt R-BASIC in die Exponentialdarstellung. Die Felder highLimit und lowLimit der Systemvariablen numberFormat bestimmen die Grenze für diesen Übergang, das Feld exponentMode bestimmt die Darstellung des Exponenten.Für die folgenden Beispiele nehmen wir an, dass das Feld formatFlags der globalen Variablen numberFormat den Wert Null hat, so dass das Wechseln ins Exponentialformat nicht verhindert wird.
Beispiele für highLimit = 3:
Beispiele für highLimit = 4:
Das Umschalten in die Exponentialdarstellung kann für große Zahlen verhindert werden, wenn man das Bit FF_NO_EXP_HIGH im Feld formatFlags der globalen Variablen numberFormat setzt. Statt der Umschaltung ins Exponentialformat erfolgt dann eine Fehlerausgabe der Form ####.##
Beispiele für lowLimit = 3:
Hinweis: Wenn der Wert im Feld maxDigits zu klein ist, kann es sein, dass die Zahl gerundet wird.
Beispiele für lowLimit = 1, maxDigits = 4, digitMode = DM_FRAC_DIGTS, d.h. es werden maximal 4 Nachkommastellen angezeigt.
Beispiele für lowLimit = 1 maxDigits = 3, digitMode = DM_FRAC_DIGITS FF_NO_EXP_LOW ist nicht gesetzt
FF_NO_EXP_LOW ist gesetzt
EXP_FORCE + EXP_SCI ( = 3) Wissenschaftliche Exponentialdarstellung erzwingen. ^1.3 Komplexe BeispieleAllgemeine Hinweise:
|
DIM nf AS NumberFormatStruct
DIM n
nf = numberFormat ' aktuelle Belegung merken
numberFormat.exponentMode = EXP_FORCE
FOR n = 1 TO 8 STEP 0.7
Print n
NEXT
numberFormat = nf ' Wieder herstellen
|
|
Beispiel 2: Vorbereiten eines anderen Zahlenformats in einer Variablen |
DIM nf AS NumberFormatStruct
Print 20/3 ' 6.6667
nf = SetNumberFormat ( NF_INTEGER ) ' erweiterte Syntax!
' numberFormat wird nicht geändert
Print 20/3 ' 6.6667
numberFormat = nf
Print 20/3 ' 7
|
|
Beispiel 3: Eine Funktion, die eine NumberFormat-Struktur bearbeitet. |
FUNCTION SetPlusSign(nf AS NumberFormatStruct ) as NumberFormatStruct nf.plusSign = PS_ALWAYS RETURN nf END FUNCTION |
|
Beispiel 4: SetNumberFormat ( NF_FIXED_4 ) bewirkt, das Zahlen immer mit 4 Stellen nach dem Komma dargestellt werden, auch dort , wo es nicht nötig ist, z.B. bei 1.0000 und 0.2500
|
SetNumberFormat ( NF_FIXED_4 ) numberFormat.minDigits = 0 Print 1 ' 1 Print 1/4 ' 0.25 Print 1/3 ' 0.3333 |
|
Hinweis zu Beispiel 4: Der Standard für maxDigits ist 5. Es wurde aber von SetNumberFormat (NF_FIXED_4) auf den Wert 4 gesetzt.
Beispiel 5: Sie wollen Geldbeträge mit führendem Plus, einem führenden Leerzeichen und der Währung 'Euro' ausgeben. |
SetNumberFormat ( NF_CURRENCY ) numberFormat.preChars = " " numberFormat.plusSign = PS_ALWAYS numberFormat.addChars = " Euro" |
|
Beispiel 6: Ergänzung zu Beispiel 5. Das von Print automatisch angehängte Leerzeichen soll unterdrückt werden. Um bereits gesetzte Flags zu erhalten (FF_NO_EXP_LOW wird bereits von SetNumberFormat (NF_CURRENCY) gesetzt) wird die Kombination mit AND verwendet. |
Print 307.87 ' |
Hinweis zu Beispiel 6: Die Variante numberFormat.formatFlags + FF_PRINT_ADD_NO_SPACE würde in diesem konkreten Fall ebenfalls zulässig, da man in diesem Beispiel sicher sein kann, dass FF_PRINT_ADD_NO_SPACE noch nicht gesetzt ist.
^ |