Das R-BASIC Handbuch im HTML-Format
Startseite  > R-BASIC  > Das R-BASIC Handbuch im HTML-Format

R-BASIC - Spezielle Themen

Einfach unter PC/GEOS programmieren

Autor: Rainer Bettsteller
HTML-Version: Mütze - Hinweise & Fehler an

1. Formatierung von Zahlen


Um einzustellen, wie R-BASIC Zahlen darstellt, haben Sie drei Möglichkeiten:
  1. Sie verwenden das voreingestellte Zahlenformat. Das sollte für viele Standardanwendungen ausreichen.

  2. Sie verwenden die Funktion SetNumberFormat, die im Abschnitt 1.1 beschrieben wird. Damit können Sie weitere typische Standardformate einstellen, wie z.B. eine feste Anzahl von Nachkommastellen.

  3. Wenn Sie damit nicht auskommen, haben Sie mit Hilfe der globalen Variablen numberFormat weitgehende Kontrolle darüber, wie R-BASIC Zahlen ausgibt. Im Abschnitt 1.2 finden Sie ausführliche Informationen dazu. Sie können z.B. vorgeben, wie viele Nachkommastellen ausgegeben werden oder wann in die Exponentialdarstellung gewechselt wird.

^

1.1 Standard-Zahlenformate

Fü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.

SetNumberFormat

Stellt das Zahlenformat für die Anzeige von Zahlen ein. Die verfügbaren Zahlenformate finden Sie in der Tabelle auf der nächsten Seite.
Syntax 1: SetNumberFormat format
Die Systemvariable numberFormat wird belegt.
Das neue Zahlenformat wird sofort wirksam.

format: einzustellendes Zahlenformat (ein numerischer Wert)


Beispiele:
SetNumberFormat  NF_NORMAL
SetNumberFormat (NF_SCI_4)  ' Klammern sind OK
Weitere Beispiele finden Sie im Abschnitt 1.3 (Komplexe Beispiele)


Für 'format' stehen folgende Werte zur Verfügung:

Tabelle

(1) Durch die interne Zahlendarstellung kann es zu Rundungsfehlern kommen. Intern wird deswegen ein Flag gesetzt (FF_NO_EXP_LOW, siehe Kapitel 1.2), das bewirkt, dass Werte sehr nahe an Null (z.B. 1E-07) als Null angezeigt werden.

(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.
Syntax 2: <nf> = SetNumberFormat (format)

<nf> Variable vom Typ NumberFormatStruct.
Die Systemvariable numberFormat wird nicht geändert, d.h. das eingestellte Zahlenformat ändert sich nicht. Statt dessen wird die Variable nf mit den von SetNumberFormat gelieferten Daten belegt.


^

1.2 Die numberFormat Variable

Wenn 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 Überblick

Die 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:

minDigits, maxDigits, digitMode
Diese Felder bestimmen, mit wie vielen Stellen Zahlen dargestellt werden. Details dazu finden Sie im Abschnitt 1.2.2
highLimit, lowLimit, exponentMode
Diese Felder bestimmen, wann in die Exponentialdarstellung gewechselt wird, also z.B. 1.234567E+05 statt 123456.7 ausgegeben wird und ob der Exponent in 3er-Schritten angezeigt wird. Details dazu finden Sie im Abschnitt 1.2.3.
plusSign
Dieses Feld bestimmt, ob bei positiven Zahlen ein '+' geschrieben werden soll oder nicht. Negative Vorzeichen werden immer geschrieben. plusSign kann sein:
PS_NONE (0, kein Plus schreiben z.B.: Bild)
PS_SPACE (1, statt Plus ein Leerzeichen schreiben z.B.: Bild )
PS_ALWAYS (2, Plus immer schreiben z.B.: +12.567 )
Der Standard ist PS_SPACE.
preChars, addChars
Enthalten jeweils bis zu 7 Zeichen, die vor (preChars) oder nach (addChars) der Zahl angefügt werden. Das ist z.B. bei Währungsangaben oder für Sperrzeichen sinnvoll. Standardmäßig sind diese Felder leer.

Beispiel:
numberFormat.preChars = '---- '
numberFormat.addChars = ' Euro'
PRINT 123,87

Auf dem Bildschirm erscheint: --- 123.87 Euro
formatFlags
Formatflags enthält einige Werte, die das Verhalten der Zahlenausgabe modifizieren können. Die Werte sind so gewählt, dass jeweils einzelne Bits gesetzt sind (sog. Bit-Flags), so dass sie mit OR, AND und NOT, aber auch mit Plus (+) verbunden werden können.

Folgende Werte sind definiert, die anderen Bits sind reserviert. Der Standard ist, dass kein Bit gesetzt ist (formatFlags = 0)

FF_PRINT_ADD_NO_SPACE (= 1) bewirkt, dass Print kein zusätzliches Leerzeichen an die Zahlen hängt. Normalerweise hängt Print zusätzlich zu den in addChars angegebenen Zeichen ein weiteres Leerzeichen an, um die Lesbarkeit zu verbessern. Str$ und StrLocal$ hängen grundsätzlich kein Leerzeichen an.

FF_NO_EXP_LOW (= 2) bewirkt das bei Zahlen, deren Betrag zwischen Null und 1 liegt, nicht in die Exponentialdarstellung gewechselt wird. Das ist sinnvoll z.B. bei Währungsangaben.

Hinweis 1: Der Wert des Feldes lowLimit, der sonst festlegt, wann in die Exponentialdarstellung gewechselt wird, wird ignoriert, statt dessen wird auf die geforderte Stellenzahl gerundet.

Hinweis 2: Dieses Flag ist im digitMode DM_VALID_DIGITS nicht verwendbar.

FF_NO_EXP_HIGH (= 4) bewirkt, dass bei großen Zahlen nicht in die Exponentialdarstellung gewechselt wird.

Hinweis Der Wert des Feldes highLimit, der sonst festlegt, wann in die Exponentialdarstellung gewechselt wird, wird ignoriert. Zahlen die sich nicht mehr darstellen lassen, werden z.B. als "#####.###" angezeigt. Das ist z.B. bei der Fehlersuche sinnvoll.


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 Stellenzahl

Die Felder minDigits, maxDigits, digitMode bestimmen, mit wie vielen Stellen Zahlen dargestellt werden.
minDigits bestimmt die minimale Stellenzahl, die ausgegeben werden soll.
Hat die Zahl weniger Stellen, so werden nach dem Komma Nullen angehängt.

Beispiel für minDigits = 5: 12.34 wird als 12.340 ausgegeben

maxDigits bestimmt die maximale Stellenzahl, die ausgegeben werden soll.
Hat die Zahl mehr Stellen, so wird gerundet.

Beispiel für maxDigits = 5: 10/3 wird als 3.3333 ausgegeben

Hinweis: Vorkommastellen werden nicht gerundet. Nur Nachkommastellen werden gerundet.

Beispiel für maxDigits = 5: 123456.78 wird mit 6 Stellen als 123457 ausgegeben

digitMode bestimmt, welche Stellen für minDigits und maxDigits zählen.
digitMode kann sein:
DM_ALL_DIGITS (0, alle Stellen zählen),
DM_FRAC_DIGITS (1, nur Nachkommastellen zählen)
DM_VALID_DIGITS (2, gültige Stellen zählen)
Die folgenden Beispiele setzen voraus, das minDigits = 3 und maxDigits = 5 gesetzt wurde.
    digitMode = DM_ALL_DIGITS (alle Stellen zählen)
    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:
    1/3  --> 0.3333 (5 Stellen insgesamt)
    0.1  --> 0.10   (mind. 3 Stellen insgesamt)
    1001 --> 1001.0 (5 Stellen insgesamt)
    

    digitMode = DM_FRAC_DIGITS ( nur Nachkommastellen zählen)
    Es werden immer Nachkommastellen geschrieben. Maximal maxDigits, mindestens jedoch minDigits Nachkommastellen.

    Beispiele:
    1/3  --> 0.33333  (5 Nachkommastellen)
    0.1  --> 0.100    (mind. 3 Nachkommastellen)
    1001 --> 1001.000 (mind. 3 Nachkommastellen)
    

    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.

    Beispiele:

    1/3  --> 0.33333  (5 gültige Ziffern)
    0.1  --> 0.100    (3 gültige Ziffern)
    1001 --> 1001     (4 gültige Ziffern)
    


Verwenden Sie minDigits = maxDigits, wenn Sie eine feste Stellenzahl vorgeben wollen.

Beispiel: immer 2 Nachkommastellen

minDigits = 2
maxDigits = 2
digitMode = DM_FRAC_DIGITS

Beispiele:

1/3  --> 0.33
0.1  --> 0.10
1001 --> 1001.00
Die Standardeinstellungen von R-BASIC sind:
minDigits = 1
maxDigits = 5
digitMode = DM_VALID_DIGITS

Beispiele:

1/3      --> 0.33333
0.1      --> 0.1
1001     --> 1001
123456.7 --> 123457 (gerundet, aber 6 Stellen,
             weil Vorkommastellen nie gerundet werden)

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 Exponentialdarstellung

Lä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.

highLimit gibt die maximale Anzahl der Vorkommastellen an, bevor ins Exponentialformat gewechselt wird.
Erlaubt sind Werte von 0 bis 15. Der Standardwert ist highLimit = 7

Beispiele für highLimit = 3:

12.3    --> 12.3
123.4   --> 123.4
1234.5  --> 1.2345E+03
12345.6 --> 1.23456E+04

Beispiele für highLimit = 4:

12.3    --> 12.3
123.4   --> 123.4
1234.5  --> 1234.5
12345.6 --> 1.23456E+04
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 ####.##

lowLimit gibt die maximale Anzahl von führenden Nullen an, einschließlich der Null vor dem Komma,
bevor ins Exponentialformat gewechselt wird. Der Standardwert ist lowLimit = 4

Beispiele für lowLimit = 3:

0.123    --> 0.123
0.0123   --> 0.0123
0.00123  --> 0.00123
0.000123 --> 1.23E-04
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.
Das betrifft in den folgenden Beispielen die blau markierte Zahl.

0.123    --> 0.123
0.0123   --> 0.0123
0.00123  --> 0.0012
0.000123 --> 1.23E-04


Das Umschalten in die Exponentialdarstellung kann für Zahlen mit einem Betrag kleiner als 1 verhindert werden, wenn man das Bit FF_NO_EXP_LOW im Feld formatFlags setzt. Dann wird lowLimit ignoriert, es wird stattdessen auf die durch die Felder maxDigits und digitsMode vorgegebene Stellenzahl gerundet.

Beispiele für lowLimit = 1 maxDigits = 3, digitMode = DM_FRAC_DIGITS FF_NO_EXP_LOW ist nicht gesetzt

0.678   --> 0.678
0.0678  --> 6.78E-02
0.00678 --> 6.78E-03
FF_NO_EXP_LOW ist gesetzt
0.678     --> 0.678
0.0678    --> 0.068 (gerundet)
0.00678   --> 0.007 (gerundet)
0.000678  --> 0.001 (gerundet)
0.0000678 --> 0.000


exponentMode bestimmt, in welcher Weise der Exponent dargestellt wird.
Der Standard ist exponentMode = EXP_NORMAL
    Erlaubte Werte sind:
    EXP_NORMAL ( = 0) normale Darstellung

    EXP_SCI ( = 1) wissenschaftliche Darstellung in 3er-Schritten

    Die 12er-Reihe sieht dann so aus:
          12E+00
         144E+00
       1.728E+03
      20.736E+03
     248.832E+03
    2.985984E+06
    
      EXP_FORCE ( = 2 ) Erzwingen der Exponentialdarstellung. Zahlen werden auch dann im Exponentialformat dargestellt, wenn dies eigentlich nicht erforderlich ist. z.B. 1 als 1E+00
        EXP_FORCE hat absoluten Vorrang, auch vor den Flags FF_NO_EXP_LOW und FF_NO_EXP_HIGH.

      EXP_FORCE + EXP_SCI ( = 3) Wissenschaftliche Exponentialdarstellung erzwingen.


^

1.3 Komplexe Beispiele

Allgemeine Hinweise:
  • Sie können Variablen vom Typ NumberFormatStruct definieren. Wenn Sie der Systemvariablen numberFormat eine solche Variable zuweisen (numberFormat = ..), werden die in der selbst definierten Variablen gespeicherten Werte aktiviert.

  • Achten Sie auf konsistente Werte (z.B. minDigits <= maxDigits), wenn Sie numberFormat oder andere Variablen vom Typ NumberFormatStruct belegen. Die Ergebnisse könnten sonst unerwartet und verwirrend sein. Typische Fehler korrigiert R-BASIC selbständig ohne Fehlermeldung!

  • Sie können die mit SetNumberFormat eingestellten Zahlenformate nachträglich modifizieren, indem sie die numberFormat-Variable ändern.
Beispiel 1: Zeitweise Exponentialdarstellung erzwingen. Der aktuelle Wert der numberFormat-Variable wird in einer anderen Variablen zwischengespeichert.
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

Wenn Sie die nachgestellten Nullen entfernen wollen, setzten Sie minDigits auf Null.

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        '  <- Leerzeichen am Ende

numberFormat.formatFlags = numberFormat.formatFlags AND FF_PRINT_ADD_NO_SPACE

Print 307.87        '  <- kein Leerzeichen mehr
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.

^

Weiter...