isSingle(), isInteger(), isLong() - MS-Office-Forum
MS-Office-Forum

Zurück   MS-Office-Forum > Microsoft Visual Studio /.NET > Visual Basic für Windows (alle Versionen bis 6.0)
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Themen-Optionen Ansicht
Alt 03.06.2004, 17:23   #1
StehtimSchilf
MOF Profi
MOF Profi
Standard isSingle(), isInteger(), isLong()

Hi Forum,

wer hat eine einleuchtende Idee für die Umsetzung obiger Funktionen? analog isDate, etc....?

Gruz
SiS

__________________

Win, Off, SQL-Server - alles MS 2000
StehtimSchilf ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 04.06.2004, 05:44   #2
Stefan Kulpa
MOF Meister
MOF Meister
Standard

Schau dir mal den VarType()-Befehl an:

Code:

Sub Test()
 
    Dim iValue      As Integer
    Dim lValue      As Long
    Dim sglValue    As Single
 
    iValue = 1
    lValue = 1
    sglValue = 1
 
    Debug.Print IsInteger(iValue)   '-> True
    Debug.Print IsInteger(lValue)   '-> False
    Debug.Print IsInteger(sglValue) '-> False
 
    Debug.Print IsLong(iValue)      '-> False
    Debug.Print IsLong(lValue)      '-> True
    Debug.Print IsLong(sglValue)    '-> False
 
    Debug.Print IsSingle(iValue)    '-> False
    Debug.Print IsSingle(lValue)    '-> False
    Debug.Print IsSingle(sglValue)  '-> True
 
End Sub
    Public Function IsInteger(vValue) As Boolean   IsInteger = (VarType(vValue) = vbInteger)   End Function
  Public Function IsSingle(vValue) As Boolean   IsSingle = (VarType(vValue) = vbSingle)   End Function
  Public Function IsLong(vValue) As Boolean   IsLong = (VarType(vValue) = vbLong)   End Function
Code eingefügt mit dem MOF Code Converter

HTH

__________________

Stefan
Stefan Kulpa ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten

Alt 04.06.2004, 08:51   #3
StehtimSchilf
Threadstarter Threadstarter
MOF Profi
MOF Profi
Standard

So Simple.....

ich verrat jetz besser nicht, was ich für 3 funktions-Bodies erstellt habe.....

:P

Hey Danke HTH???

Gruz
SiS

__________________

Win, Off, SQL-Server - alles MS 2000
StehtimSchilf ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 04.06.2004, 09:39   #4
Stefan Kulpa
MOF Meister
MOF Meister
Standard

HTH - Hope, this helps!

Siehe auch Acronyme...

__________________

Stefan
Stefan Kulpa ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 08.06.2004, 13:50   #5
StehtimSchilf
Threadstarter Threadstarter
MOF Profi
MOF Profi
Standard

Ganz so simpel dann doch wieder nicht....


Code:

Public Function isDouble(var As Variant) As Boolean
   If IsNull(var) Then
      isDouble = False
   Else
      isDouble = ((VBA.VarType(Val(var)) = vbDouble) Or isSingle(var))
   End If
End Function

Public Function isSingle(var As Variant) As Boolean
   If IsNull(var) Then
      isSingle = False
   Else
      isSingle = ((VBA.VarType(Val(var)) = vbSingle) Or isLong(var))
   End If
End Function

Public Function isLong(var As Variant) As Boolean
   If IsNull(var) Then
      isLong = False
   Else
      isLong = ((VBA.VarType(Val(var)) = vbLong) Or isInteger(var))
   End If
End Function

Public Function isInteger(var As Variant) As Boolean
   If IsNull(var) Then
      isInteger = False
   Else
      isInteger = (VBA.VarType(Val(var)) = vbInteger Or isByte(var))
   End If
End Function

Public Function isByte(var As Variant) As Boolean
   If IsNull(var) Then
      isByte = False
   Else
      isByte = ((VBA.VarType(Val(var)) = vbByte))
   End If
End Function
Problem bei Steffs Version ist (oder ich habe eben meine Definition zu wenig klar erläutert) dass z.B. isLong(20) False liefert! Den 20 ist Integer! Aber da Long eine echte Obermenge der Integers ist, ist jeder Integer auch ein Long.

isSingle(2) -> True

hingegen:
a = cDbl(2)
isSingle(a) -> False


thx
SiS (Akronym für StehtimSchilf )


Super.... jetz gerade bemerkt, dass dies auch nicht tut!

für isInteger("20") erhalte ich false!

den nach einem Val("20") erhalte ich den Typ Double....




kann doch nicht so schwierig sein??????

Also wie nun?

__________________

Win, Off, SQL-Server - alles MS 2000

Geändert von StehtimSchilf (08.06.2004 um 14:03 Uhr).
StehtimSchilf ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 08.06.2004, 15:28   #6
Stefan Kulpa
MOF Meister
MOF Meister
Standard

Die Funktion VarType() gibt den Type der Variablen zurück (wie der Name schon sagt) und betrachtet nicht den Wert. Daher muss man hier "typ-sicher" mit entsprechend deklarierten Variablen arbeiten.

Um die Größe eines Wertes zu kategorisieren, benötigt man den Variablentyp nur zweitrangig - aber das Ergebnis ist u.U. falsch.

Der Wert 20 kann fast alles sein bzw. in fast allen Variablentypen gespeichert werden: Byte, Integer und Long. Als 20.0 kämen noch alle Fließkommatypen hinzu.

Also, die Aussage 20 ist Integer ist de facto falsch.
Die Aussage "... da Long eine echte Obermenge der Integers ist, ..." ist ebenfalls falsch.

Mir ist allerdings nicht ganz klar, was das Ergebnis sein soll.
Wenn du den kleinsten, passenden Variablentypen möchtest, käme bei dem Wert 20 Byte heraus (0-255). Dabei muss man jedoch explizit die Fließkommatypen ausschließen...

Du solltest also mit deklarierten Variablen arbeiten, sonst kommst du zu keinem gescheiten Ergebnis.

Gruß

__________________

Stefan
Stefan Kulpa ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.06.2004, 16:14   #7
StehtimSchilf
Threadstarter Threadstarter
MOF Profi
MOF Profi
Standard

Hi Stefan,

wieso die Aussage falsch sein sollte, versteh ich jetz nicht! Denn jede Integer-Zahl kann in einem Long gespeichert werden. Also kann jeder Int ein Long sein. Aber nicht umgekehrt....

Aber eigentlich geht es mir hier nicht um den Typ. Evtl. liegts daran, sondern nur um den Bereich!

Mit den Funktionen will ich nur Prüfen ob eine angegebene Zahl im angegebenen Typ gespeichert werden kann:

isDouble(20) -> True
isDouble(20.2) -> True
isDouble(10E7000) -> False (OverFlow)
isDouble("hallo") -> False (string)

isInteger(20.2) -> False (Ints sind ganzzahlig)
isInteger(10E6) -> False ( nur bis 32786)

isLong(20.2) -> False
isLong(20) -> True
isLong(10E6) -> True

Ich will weder den grössten noch den kleinsten passenden Variablen Typ, sondern nur, ob die angegebene Variable in dem zu prüfenden Variablentyp gespeichert werden kann!

Wofür?
mit den InputBox() kann man ja Eingaben abfragen. Nun möchte ich eben mit diesen Funktionen prüfen, ob die Eingabe für meinen Bereich stimmt. Will ich nur ganze Zahlen ---> if isLong(strEingabe) then ....

jetz bischen klarer?

Gruz
SiS

__________________

Win, Off, SQL-Server - alles MS 2000
StehtimSchilf ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.06.2004, 19:35   #8
Stefan Kulpa
MOF Meister
MOF Meister
Standard

Zitat:

wieso die Aussage falsch sein sollte, versteh ich jetz nicht!

Weil der Wert 20 Byte, Integer oder Long sein kann. Also kann man nicht grundsätzlich feststellen, dass 20 Integer ist. Es geht nicht um den Wert, sondern um den Variablentyp.

Deine Routinen können grundsätzlich nicht funktionieren, da du immer Varianten übergibst. Indem du dann explizit in Double konvertierst (Val), kommt da nicht das gewünscht Ergebnis heraus.

Eine Inputbox gibt grundsätzlich einen String zurück (und niemals Null) - also hast du schon mal keinen nummerischen Ansatz. Konvertieren mit Val() fällt auch flach, da du dann immer einen Double-Wert hast!

Zitat:

ob die Eingabe für meinen Bereich stimmt

Wie sieht der denn aus? Mir ist immer noch nicht klar, worauf das hinauslaufen soll. Wenn du prüfen möchtest, ob der "Wert" in eine Byte-, Integer- oder Long-Variable passt, musst du sehr wohl die Grenzen abchecken. Aber da beisst sich die Katze in den Schwanz - wo fängt diese Prüfung an und wo hört sie auf (siehe das 20er Beispiel).

Eine konkretes Code-Beispiel wäre hilfreich zu verstehen, was du genau vor hast.

Gruß

__________________

Stefan
Stefan Kulpa ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.06.2004, 20:32   #9
StehtimSchilf
Threadstarter Threadstarter
MOF Profi
MOF Profi
Konfus

hmmm...

Aber mir geht es um den Wert! Es geht um den Wert in der Variable 'var' und nicht um den Typ, denn die Variable 'var' enthält!


Code:

Dim x As KrasserVariblenTyp
x = 20
Daher ist die Aussage:
Code:

isLong(x) =  True
Wahr! Weil '20' ein Element der Longs ist
Ebenso ist
Code:

isInteger(x) = True
wahr, weil auch eben 20 ein Element der Integers ist.

Auf dieser Basis beruhnend will ich eben nun diese Funktionen schreiben!

Jeder Wert der Menge Integer ist in der Menge der Longs enthalten, oder etwa nicht? Aber das ist hier nicht das Thema... wie gieng das Akronym? OT?

Es geht um folgendes:
Code:

strEingabe = InputBox(....)
Super, jetz habe ich in strEingabe die Eingabe. Jetz muss ich prüfen ob diese Eingabe gültig (Bereich) ist. Der Bereich ist mannigfaltig!
von 20 bis 1000 (ganzzahlig)
von -1000.000 bis 1000 (dezimalzahlen)
von 1.1.2000 bis 22.3.2005
von 'Access' bis 'Word'

Im normalen Fall müsste ich nun für jede Art immer ein folgendes Konstrukt schreiben:

Code:

Do
   strEingabe = InputBox(...)
Loop Until isValidInput
z.B.
Code:

Loop Until strEingabe = "" or cdate(strEingabe) >= cdate("1.1.2000") and <= cdate("22.3.2005")
Code:

loop Until strEingabe = "" or ..... or .... or



also habe ich eine Funktion
Code:

Public Function InputBoxX(.... die selben Parameter, intType as Integer, varFrom as variant, varTo as variant, boolForceInput as Boolean) as String
geschrieben.

nun rufe ich jeweils nur
Code:

strEingabe = InputBoxX(...., "1.1.2000", "22.3.2005", vbDate, False)
auf - fertig!

Kein Do, kein Loop gar nichts! Eine Zeile!

Und jetzt kommts:

Unsere Datenbank enhält MitgliederNummern (Longs). Also ich geschrieben:
Code:

strEingabe  = InputBoxX((...., 0, 99999, vbLong, True)
Dann ist mir aufgefallen, dass meine "isLong()" Funktion nicht funktionierte (Eingabe von dezimalzahlen waren innerhalb der Grenzen möglich).

Damit dies eben nicht möglich ist (Dezimalzahlen) muss der Parameter vom "Typ" Long sein! Integer geht nicht, weil wir MitgliederNr > 32786 haben.

Ich gebe zu, für diese Beispiele sind isInteger(), isByte() und isSingle() nicht nötig! denn mit isLong() und den angegebenen Grenzen lässt sich auch nur Ints erfassen! Und Singles und Doubles? Wer gibt von Hand schon eine Zahl ein, welche effektiv von Double nd Single unterscheidet? Daher würde für 20.1 eine Funktion isDouble() reichen.

Aber, prévoir c'est pouvoir, wie die Franzosen ja sagen........ also wünsche ich eben die anderen Funktionen auch noch!


Gruz
SiS

Geändert von StehtimSchilf (10.06.2004 um 20:35 Uhr).
StehtimSchilf ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 11.06.2004, 06:19   #10
Stefan Kulpa
MOF Meister
MOF Meister
Standard

Offensichtlich hast du deine Lösung in der anonymen Funktion InputBoxX gefunden?

Zitat:

also wünsche ich eben die anderen Funktionen auch noch!

Welche anderen?

Ich kann mich nur wiederholen; um eine "saubere" Abgrenzung der Werte zu erhalten, muss man die Gültigkeitsbereiche abprüfen. Selbst dabei muss man einen Kompromiss formulieren (der kleinste/größte Wert zieht). Problematisch dabei sind die Fließkommazahlen (Single und Double - von Currency und Date mal abgesehen).

Wenn's denn eine Inputbox sein soll, würde ich mir eine eigene Inputbox schreiben, die einen maskierten Eingabebereich besitzt (nur Ganzzahlen oder Fließkommazahlen bzw. Datum). Die "Grenzwertberechnung" wäre dann IMHO etwas schlanker.

Gruß

__________________

Stefan
Stefan Kulpa ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 20.08.2004, 16:23   #11
StehtimSchilf
Threadstarter Threadstarter
MOF Profi
MOF Profi
Standard

So gehts

Code:

Public Function isInteger(var As Variant) As Boolean  
   Dim tmpInteger As Integer
   On Error GoTo FEHLER
   
   If IsNumeric(var) Then var = Val(var)
   tmpInteger = var
   isInteger = (tmpInteger = var)
EXIT_FUNCTION:
   Exit Function
   
FEHLER:
   isInteger = False
   Resume EXIT_FUNCTION
End Function
Sorry Steff wegen dem Gestusse über, "is" und "Obermenge", evtl. sollte ich die Funktionen umbennen in "isConvertableToInteger" oder so ähnlich! Es geht (fürmich) nicht um den Typ sondern um den Wert!

auf jeden Fall funktioniert diese Funktion und für alle anderen Standard-Datentypen analog!


cheerioh
SiS

__________________

Win, Off, SQL-Server - alles MS 2000
StehtimSchilf ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 25.08.2004, 16:42   #12
Sascha Trowitzsch
MOF Guru
MOF Guru
Standard

Nenne diese Funktion am besten IsVT4. Das ist der OLE-Typ und trifft es am ehesten.

Ciao, Sascha

__________________

Microsoft Access MVP
O2k bis O2010, VB6, VS2008, Delphi7, ...
Bitte keine ungefragten E-Mails. Probleme werden hier gelöst.
Bitte beachten: Grundlegendes zum Access-Forum

Knowhow auf Access-im-Unternehmen | Das Access 2007 Praxisbuch für Entwickler | www.mossTOOLs.de
Sascha Trowitzsch ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 25.08.2004, 16:46   #13
StehtimSchilf
Threadstarter Threadstarter
MOF Profi
MOF Profi
Standard

hä?

wofür steht VT4? Und was hat jetz OLE hier zu suchen? :P OLE mag ich diesen Monat gar nicht!

Deine Meinung zur Funktion?


cheerioh
SiS

__________________

Win, Off, SQL-Server - alles MS 2000
StehtimSchilf ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 25.08.2004, 20:45   #14
Sascha Trowitzsch
MOF Guru
MOF Guru
Standard

Es gibt in OLE verschiedene Integertypen. Der, den du mit deiner Funktion ermitteln willst ist ein VT4. Es gibt z.B. auch einen VT8. Fast alles unter VB hat (intern) mit OLE zu tun. Aber das erläutere ich hier nicht weiter.
Es war auch eher ein Scherz.
Zur Funktion selbst kann ich nur sagen: Wenn sie funktioniert, dann prima!
Aber verstanden hab ich den Thread wohl ebensowenig wie Stefan.

Ciao, Sascha

__________________

Microsoft Access MVP
O2k bis O2010, VB6, VS2008, Delphi7, ...
Bitte keine ungefragten E-Mails. Probleme werden hier gelöst.
Bitte beachten: Grundlegendes zum Access-Forum

Knowhow auf Access-im-Unternehmen | Das Access 2007 Praxisbuch für Entwickler | www.mossTOOLs.de
Sascha Trowitzsch ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 25.08.2004, 21:11   #15
StehtimSchilf
Threadstarter Threadstarter
MOF Profi
MOF Profi
Standard


liegt wohl daran, dass Hochdeutsch nîcht meine Muttersprache ist! Viu lieber würi ja so schriibe, aber da hätti wohl niä Ussicht uf Hiuf

Es ist geht ums Thema User-Eingaben:
Wie löst Du das Problem wenn der User nur ganze Zahlen von 5-300 Eingeben darf? anschliessend nur ganze Zahlen von -234234 bis < MAX_LONG? anschliessend nur Dezimalzahlen zw. - 2 PI und 2 PI, anschliessend einen 6 Zeichen langen String, der nur aus Grossbuchstaben bestehen darf und mit "N" beginnt und "R" endet?

mit der Bedingung 5-300 weiss ich, dass jetz nur Zahlen im - verzeih mir den evtl. Missbrauch des folgendes Wortes - "Integer-Bereich" gültig sind!
also reicht die Bedingung: "'isInteger(input)' and intput >=2 and input <= 300"

Daher jetz meine adaptierte InputBoxX-Funktion! Ich muss mich jetz nicht mehr mühsam mit Gültigkeitstests nach einem Input herumschlagen!

Es wundert mîch jetz schon, wie ihr sowas löst, wenn der User z.B. 10 Eingaben machen muss (ob via Textfeld oder Input-Box spielt keine Rolle) und ihr diese Eingaben auf Gültigkeit prüfen müsst? Der DAU ist auch bei uns vertreten und gibt für ein vierstellige Jahreszahl trotzdem '4' ein....

Gruess
SiS

__________________

Win, Off, SQL-Server - alles MS 2000
StehtimSchilf ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:52 Uhr.



Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.

Copyright ©2000-2024 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günter Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.