I used keypress event in my textbox. When I pressed "2" and my expected value should be 0.02. However it show "20.02"
What I tried is I set textbox property "RighttoLeft" to yes to start it from right when typing. But I want the keychar I type is not appended to the output of FactorDecimal I used in code.
Please see code below. I based it from @Visual Vincent comment from other post:
Private Sub txtChequeAmt_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtChequeAmt.KeyPress
If Char.IsDigit(e.KeyChar) = False Then
e.Handled = True
End If
FactorDecimal1.AppendNumber(e.KeyChar)
txtChequeAmt.Text = FactorDecimal1.ToString()
End Sub
Public Class FactorDecimal
Private value As String = "0"
Public DecimalPlaces As Integer
Public Sub AppendNumber(Character As Char)
If Char.IsNumber(Character) = False Then
Throw New ArgumentException("Input must be a valid numerical Character!", "Character")
value = (value & Character).TrimStart("0"c)
Else
value = (value & Character).TrimStart("0"c)
End If
End Sub
Public Sub RemoveRange(Index As Integer, Length As Integer)
If value.Length >= Me.DecimalPlaces + 1 AndAlso Index + Length > value.Length - Me.DecimalPlaces Then
Length -= 1 'Exclude decimal point
End If
If Index + Length >= value.Length Then
Length = value.Length - Index 'Out of range
value = value.Remove(Index, Length)
End If
If value.Length = 0 Then
value = "0"
End If
End Sub
Public Overrides Function ToString() As String
Dim Result As Decimal
If (Decimal.TryParse(value, Result)) = True Then
Return (Result / (10 ^ Me.DecimalPlaces)).ToString("0." & New String("0"c, Me.DecimalPlaces))
End If
Return (Result / (10 ^ Me.DecimalPlaces)).ToString("0." & New String("0"c, Me.DecimalPlaces))
End Function
Public Sub New(DecimalPlaces As Integer)
If DecimalPlaces <= 0 Then
DecimalPlaces = 1
End If
Me.DecimalPlaces = DecimalPlaces
End Sub
End Class
question from:
https://stackoverflow.com/questions/65899162/everytime-key-is-pressed-will-automatic-decimal-places-in-textbox-vb-net 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…