每次按下键都会在文本框中自动保留小数位 VB.NET
EveryTime key is pressed will automatic decimal places in textbox VB.NET
我在文本框中使用了按键事件。当我按下“2”时,我的期望值应该是 0.02。但是它显示“20.02”
我尝试的是将文本框 属性“RighttoLeft”设置为是,以便在键入时从右开始。但是我希望我键入的 keychar 没有附加到我在代码中使用的 FactorDecimal 的输出中。
请看下面的代码。我基于来自其他 post:
的@Visual Vincent 评论
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
如果你想在文本框中使用你的计算,你需要设置 e.Handled = True。
Private Sub txtChequeAmt_KeyPress(sender As Object, e As KeyPressEventArgs)
If Char.IsDigit(e.KeyChar) = False Then
e.Handled = True
' No point to continue if it is not a digit because
' in that case you throw into the AppendNumber. Better avoid the exception
Return
End If
FactorDecimal1.AppendNumber(e.KeyChar)
txtChequeAmt.Text = FactorDecimal1.ToString()
' Don't let the forms engine add the number to your textbox
' you have already defined its content
e.Handled = True
End Sub
我在文本框中使用了按键事件。当我按下“2”时,我的期望值应该是 0.02。但是它显示“20.02”
我尝试的是将文本框 属性“RighttoLeft”设置为是,以便在键入时从右开始。但是我希望我键入的 keychar 没有附加到我在代码中使用的 FactorDecimal 的输出中。
请看下面的代码。我基于来自其他 post:
的@Visual Vincent 评论 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
如果你想在文本框中使用你的计算,你需要设置 e.Handled = True。
Private Sub txtChequeAmt_KeyPress(sender As Object, e As KeyPressEventArgs)
If Char.IsDigit(e.KeyChar) = False Then
e.Handled = True
' No point to continue if it is not a digit because
' in that case you throw into the AppendNumber. Better avoid the exception
Return
End If
FactorDecimal1.AppendNumber(e.KeyChar)
txtChequeAmt.Text = FactorDecimal1.ToString()
' Don't let the forms engine add the number to your textbox
' you have already defined its content
e.Handled = True
End Sub