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: 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'. B.) Verhalten von 'IsNumeric' bei String-Variablen: 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. 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 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'. Dieser Tipp wurde bereits 15.376 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
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. |
Neu! sevPopUp 2.0 Dynamische Kontextmenüs! Erstellen Sie mit nur wenigen Zeilen Code Kontextmenüs dynamisch zur Laufzeit. Vordefinierte Styles (XP, Office, OfficeXP, Vista oder Windows 8) erleichtern die Anpassung an die eigenen Anwendung... Tipp des Monats April 2024 Skyfloy Chart von Microsoft und dazu noch gratis Tutorial für Microsoft Chart Controls für Microsoft .NET Framework 3.5 TOP Entwickler-Paket TOP-Preis!! Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR... |
||||||||||||||||
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. |