Wundersames IsNumeric()

Hallo!

Ich habe auf einer Form ein Textfeld (Text1), dessen Inhalt bei Änderung mit IsNumeric() überprüft wird: Es sind nur ganze Zahlen zulässig.

Nicht numerische Zeichen werden entfernt, der Cursor behält seine Position bei. Dezimalpunkte und Dezimalkomma sind nicht zulässig und werden enfternt. Soweit die Theorie.

In der Praxis funktioniert das auch ganz toll, bis auf 2 Umstände:

Wenn man eine Zahl eingibt, kann man zwischen:

  1. der vorletzten und letzten Ziffer
    und
  2. zwischen der drittletzten und vorletzten Ziffer
    die Buchstaben „d“, „D“, „e“ und „E“ einfügen.
    Konstrukte wie „1234e5“, „123e45“ sind also möglich.

„123e4e5“ wird witzigerweise wieder angemeckert (=entfernt), wie „1234ee5“ auch. Alle anderen Buchstaben werden ordnungsgemäß (sofort) entfernt!!!

Dieses verhalten wundert mich schon etwas. - Doch wo liegt der Fehler?
Im Einzelschritt werden die ‚wundersamen Zahlen‘ als numerisch anerkannt; es wird also nicht in den Ja-Pfad verzweigt.

Nun mein Code

Private Sub Text1\_Change()
 Dim i As Integer 'Zähler
 Dim intAktPos As Integer 'Aktuelle Cursorposition im Textfeld

 Text1.Text = Replace(Text1.Text, ",", "")
 Text1.Text = Replace(Text1.Text, ".", "")
 If Not IsNumeric(Text1.Text) Then
 intAktPos = Text1.SelStart
 For i = 1 To Len(Text1.Text)
 If Not IsNumeric(Mid(Text1.Text, i, 1)) Then
 Text1.Text = Replace(Text1.Text, Mid(Text1.Text, i, 1), "")
 End If
 Next i
 Text1.SelStart = intAktPos - 1
 End If
End Sub

Danke schon jetzt,
Ute

Hallo!

Hi,

Wenn man eine Zahl eingibt, kann man zwischen:

  1. der vorletzten und letzten Ziffer
    und
  2. zwischen der drittletzten und vorletzten Ziffer
    die Buchstaben „d“, „D“, „e“ und „E“ einfügen.
    Konstrukte wie „1234e5“, „123e45“ sind also möglich.
    Dieses verhalten wundert mich schon etwas. - Doch wo liegt der
    Fehler?

Das Konstrukt mit „e“ gibt an, dass eine Zahl mit 10er-Potenzen dargestellt ist.
4e3 ist also 4000, da 4*10³
Wenn du das so nicht haben möchtest, füge doch ein

deineZahl=Replace(lcase(DeineZahl),"e","")

ein.
Gruß.Timo

Im Einzelschritt werden die ‚wundersamen Zahlen‘ als numerisch
anerkannt; es wird also nicht in den Ja-Pfad verzweigt.

Nun mein Code

Private Sub Text1_Change()
Dim i As Integer 'Zähler
Dim intAktPos As Integer 'Aktuelle Cursorposition im
Textfeld

Text1.Text = Replace(Text1.Text, „,“, „“)
Text1.Text = Replace(Text1.Text, „.“, „“)
If Not IsNumeric(Text1.Text) Then
intAktPos = Text1.SelStart
For i = 1 To Len(Text1.Text)
If Not IsNumeric(Mid(Text1.Text, i, 1)) Then
Text1.Text = Replace(Text1.Text,
Mid(Text1.Text, i, 1), „“)
End If
Next i
Text1.SelStart = intAktPos - 1
End If
End Sub

Danke schon jetzt,
Ute

Hallo Timo!

*rumschnibbel*

Das Konstrukt mit „e“ gibt an, dass eine Zahl mit
10er-Potenzen dargestellt ist.
4e3 ist also 4000, da 4*10³
Wenn du das so nicht haben möchtest, füge doch ein

deineZahl=Replace(lcase(DeineZahl),„e“,"")

ein.

Daran habe ich garnicht gedacht *rotwerd*
Gut, dann komme ich um die beiden Zeilen (‚d‘ geht ja auch durch) nicht herum.

Sei Dir meines Dankes sicher!
Aber lasse mich bitte nicht dumm sterben und verrate mir die Bedeutung von „d“, was ja auch durchgeht.

Tausend Dank!
Ute

Hallo Timo!

Hi Ute,

Gut, dann komme ich um die beiden Zeilen (‚d‘ geht ja auch
durch) nicht herum.

Sei Dir meines Dankes sicher!
Aber lasse mich bitte nicht dumm sterben und verrate mir die
Bedeutung von „d“, was ja auch durchgeht.

Gibt an, dass es sich um den Datentyp „Decimal“ handelt.

Tausend Dank!

Dafür nicht.

Ute

Gruß.Timo

1 Like

Vielen Dank (OT)
.

Hallo Ute

Es gäbe noch die Möglichkeit, Tastatureingaben direkt im KeyPress-Ereignis der Textbox zu verhindern.

Ich schreibe einfach mal das Prinzip:

Private Sub Text1\_KeyPress(KeyAscii As Integer)
 With Text1
 Select Case KeyAscii
 Case 8, 48 To 57 'Backspace, Null bis Neun
 Exit Sub
 Case Else 'Jede andere Taste
 KeyAscii = 0 'Löscht die Tastatureingabe
 Beep 'Macht den Ton
 End Select
 End With
End Sub

Wie gesagt, es ist nur das Prinzip. Das Ganze kann dann natürlich noch individuell angepasst werden.
Vielleicht hilft Dir das ja.

Viele Grüße
Carsten