vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Verschiedenes / Sonstiges   |   VB-Versionen: VB2005, VB200822.05.08
Arbeitsweise der Funktion "IsNumeric"

Bei Verwendung der Funktion 'IsNumeric' sind einige Sonderfälle zu beachten

Autor:   Manfred BohnBewertung:  Views:  15.334 
ohne HomepageSystem:  WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11kein Beispielprojekt 

Mit der Funktion 'IsNumeric' kann geprüft werden, ob es sich bei einer Variable um einen der numerischen Datentypen handelt bzw. ob sich der Inhalt einer Variable des Typs Char, String oder Object als Zahl auswerten (darstellen bzw. zuweisen) lässt.

Die Funktion ist im VisualBasic-Modul Information enthalten.

'IsNumeric' wird häufig zur Klärung der Frage eingesetzt, ob der Inhalt einer String- oder Object-Variable an eine Funktion weitergeleitet werden kann, die numerische Operationen durchführt - z.B. nach einer Benutzereingabe im Dialog oder nach einer Leseoperation in einer Datei oder in einer Datenbank. Aufgrund der Arbeitsweise von 'IsNumeric' empfiehlt es sich in vielen Fällen, diese Funktion zu kapseln, um zusätzliche Beurteilungen vornehmen zu können.

Die Funktion 'IsNumeric' verhält sich so ähnlich wie die Funktion 'IsDouble':

Private Function IsDouble(ByVal arg As Object) As Boolean
  Try
    Dim dbl As Double = CDbl(arg)
    Return True
  Catch ex As Exception
    Return False
  End Try
End Function

Ein wichtiger Unterschied: Die Funktion 'IsNumeric' liefert für Nothing 'false', während 'IsDouble' für Nothing 'true' zurückmeldet. In VB wird Nothing auch in einigen anderen Zusammenhängen numerisch als 0 ausgewertet - z.B. als Standardwert bei optionalen Funktionsparametern (numerische Typen).

Im folgenden habe ich kurz zusammengefasst, was mir aufgefallen ist. Daraus kann abgeleitet werden, welche Kapselung von 'IsNumeric' im konkreten Anwendungsfall jeweils erforderlich wird.

A.) Verhalten von 'IsNumeric' bei IEEE-Sonderwerten:
Die 'Zahlen' '+unendlich' (=Double.PositiveInfinity) und '-unendlich' (=Double.NegativeInfinity) werden als auswertbare Zahlen ausgewiesen. Das gilt auch für die sog. Nicht-Zahl 'Double.NaN' (not-a-number). Die Division durch 0 in einem als Parameter übergebenen Gleitkomma-Ausdruck ergibt bei Double-Werten die Rückgabe 'true'. (Es wird keine Ausnahme ausgelöst.)

Falls eine Double-Variable den Wert 'NaN' enthält, der mit 'Write' in eine sequentielle Datei geschrieben wird, entsteht beim Lesen mit 'Input' in eine Variable des Typs 'Object' ein String (NaN), aber beim direkten Einlesen in eine Double-Variable wieder der Sonderwert 'NaN'. Den String beurteilt 'IsNumeric' als 'false', den Double-Wert als 'true'.

Auch nach der Zuweisung eines IEEE-Sonderwertes auf die Value-Eigenschaft einer Zelle im DataGridView-Steuerelement liefert 'IsNumeric' für diesen Zellinhalt 'true'.
(Alles gilt entsprechend auch für den Datentyp 'Single'.)

B.) Verhalten von 'IsNumeric' bei String-Variablen:
Zahlen, die als Ziffernfolgen in String-Variablen vorliegen, deren Ausprägung außerhalb der durch Double.MaxValue und Double.MinValue definierten Spannweite liegt (z.B. "1E+500"), werden von 'IsNumeric' nicht als numerisch darstellbar ausgewiesen. Die Konvertierungsfunktion 'CDbl' löst in solchen Fällen eine Ausnahme aus.

Durch 'IsNumeric' kann nicht festgestellt werden, ob sich der als 'true' ausgewiesene Inhalt eines Strings numerisch exakt (z.B. als Double oder als Decimal) darstellen lässt oder ob er erst nach Durchführung einer Rundung bzw. in abgeschnittener Form ausgewertet werden kann. Der Begriff Rundung ist dabei nicht auf Nachkommastellen beschränkt.

Der als 'true' beurteilte Ziffernstring "1234567890123456789012345678901234567890" wird zum Double-Wert "1,23456789012346E+39" konvertiert. Als Decimal ist er wegen seiner hohen Ausprägung nicht darstellbar.
(Um darüber Aufschluss zu erhalten, ob ein Zahlenstring exakt darstellbar ist, kann man den Inhalt der String-Variable mit dem entsprechend formatiert gewandelten Double-Wert vergleichen. Hat man den obigen Ganzzahl-Ziffernstring auf eine Double-Variable namens 'dbl' zugewiesen, kann durch die formatierte Umwandlung in einen String per dbl.ToString("F0") eine für den Vergleich geeignete Ziffernfolge erzeugt werden.)

Die Funktion 'IsNumeric' wertet keine Ausdrücke in String-Variablen aus. Der Parameter "1+5" liefert deshalb 'false'.

Die Funktion 'trimmt' ggf. den eingegebenen Wert. Der String " 500 " liefert 'true'. Aber: Der String " - 500" liefert 'false', weil die Zwischenräume zwischen dem negativen Vorzeichen und der Ziffernfolge nicht ignoriert werden. Ein direkt vor- oder nachgestelltes Vorzeichen wird akzeptiert. Der String " 500- " ergibt deshalb 'true' (dargestellt als Double: -500.0). Nicht-numerische Zeichen hinter Ziffern werden bei der Beurteilung nicht abgeschnitten. Der String "33EE" wird deshalb als 'false' beurteilt.

Abhängig von der kulturspezifischen Einstellung, wird der VB-Standard-Dezimalpunkt in String-Variablen ignoriert. Der String '1.3333E+308' wird deshalb als 'false' beurteilt, während der String '1,3333E+308' als 'true' beurteilt wird (unter der Voraussetzung, dass "," als Dezimalpunkt-Kennung eingestellt ist.) Der String '1.3333E+308' wird in diesem Fall als '13333E+308' ausgewertet !! - und überschreitet deshalb den Wert Double.MaxValue. (Das diesbezügliche Beispiel in der VB-Dokumentation, das einen Standard-Dezimalpunkt im Stríng beurteilt, ist insofern etwas irreführend.) In der kapselnden Funktion kann man vor der Beurteilung eines Strings den VB-Standard-Dezimalpunkt durch den kulturspezifischen Dezimalpunkt ersetzen (Replace).

C.) Verhalten von 'IsNumeric' bei anderen Datentypen
Bei der Parameter-Übergabe einer Variable des Typs 'Boolean' ergibt 'IsNumeric' stets 'true'. Die VB-Dokumentation zu 'IsNumeric' listet Boolean als numerischen Datentyp. 'False' ergibt numerisch 0. Bei 'true' hängt die numerische Entsprechung davon ab, ob man sich bei der Konvertierung einer Framework-Methode (1) oder einer VB-Methode (-1) bedient.

Der Inhalt einer boolschen Variable, der durch 'Write' in eine sequentielle Datei eingetragen worden ist (z.B. #TRUE#), wird nach dem Einlesen (Input) in eine Object-Variable ( --> Inhaltstyp: Boolean) als numerisch ausgewiesen, beim Einlesen in eine String-Variable aber nicht.

Bei Variablen des Typs 'Object' sollte man deshalb zunächst ermitteln, welcher Inhalts-Typ aktuell vorliegt (Methode: GetType). Die alleinige Beurteilung durch 'IsNumeric' kann zu Entscheidungen führen, die im Einzelfall unbrauchbar sind.

Die Mitglieder einer Enumeration gelten als numerisch darstellbar, weil eine Aufzählung als Ganzzahl-Datentyp deklariert sein muss.

Der Inhalt einer Variable des Datentyps 'Date' liefert nur dann 'true', wenn er über die Funktion 'ToOADate' abgefragt wird. Diese Funktion dient der OLE-Automatisierung von Datumswerten und wandelt das Datum in einen Wert des Datentyps 'Double'. Die einzeln abgefragten Elemente eines Datums oder einer DateTime-Uhrzeit (Funktionen: Day, Month, Year, Hour, Minute, Second) ergeben Integer-Werte und sind deshalb numerisch auswertbar.

Bitfolgen in einer Instanz der VB-Klasse 'BitArray' werden als 'false' beurteilt. Es erfolgt keine Interpretation als (ins Zehnersystem konvertierbare) Dualzahl - obwohl Bitarrays bis zu einer Länge von 64 prinzipiell eindeutig als ULONG-Zahlen auswertbar sind. Das gilt auch für Integerwerte, die durch eine Instanz von BitVector32 'maskiert' werden. (SQL-)Null-Werte als Parameter ergeben 'false'.



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.