如何使TextBox可以将输入动态地调整为货币格式?

时间:2019-03-23 19:09:07

标签: vb.net textbox keypress

我正在设计的这个应用程序有一个名为txtValue的文本框,其属性MaxLength设置为14,TextAlign设置为Right。我希望txtValue仅接受货币,并动态格式化输入内容,以便用户无需添加逗号,只需添加一个句点即可。

我设法做到了,使得txtValue在事件txtValue_KeyPress中仅接受数字和一个点。

txtValue_LostFocus会将输入转换为货币格式。

到目前为止,这是我的代码:

Private Sub txtValue_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtValue.KeyPress

    'Allows only one dot
    If (e.KeyChar.ToString = ".") And (txtValue.Text.Contains(e.KeyChar.ToString)) Then

        e.Handled = True

        Exit Sub

    End If

    'Allows only 0 to 9 and dot (once)
    If (e.KeyChar.ToString < "0" OrElse e.KeyChar.ToString > "9") _
    AndAlso e.KeyChar <> ControlChars.Back _
    AndAlso e.KeyChar.ToString <> "." Then

        e.Handled = True

    End If

End Sub

Private Sub txtValue_LostFocus(sender As Object, e As EventArgs) Handles txtValue.LostFocus

    txtValue.Text = Format(Val(txtValue.Text), "000,000,000.00")

End Sub

我希望输入-q1w23456789012 .... 34返回输出123,456,789,012.34,但是失去焦点后的实际输出为123,456,789,012.30

这似乎很容易解决,例如将MaxLength设置为15,但是如果我不输入句点,它将允许我输入15个数字,并且在句点之后最多只希望输入12加2。 / p>

我希望输入-q1w234 .... 5678返回输出1,234.56,但是失去焦点后的实际输出为000,000,001,234.56

这似乎是一个更复杂的修复程序,因为我不想使用LostFocus事件来验证输入的内容。我希望KeyPress事件处理输入并动态格式化我键入的内容。

在这种情况下:

输入1的输出为1.00

输入123.4将具有输出123.40

输入1234.567将具有输出1,234.56

所有这些都不需要LostFocus事件,但是现在我正在使用LostFocus事件,因为这是我非常有限的知识所允许的。

更新

好吧,我现在正在使用Leave事件,但是再一次,我只使用LostFocus作为占位符,因为最后我希望TextBox调整用户键入内容的方式。

1 个答案:

答案 0 :(得分:0)

另一种处理方式。有关格式化显示数字的详细信息,请尝试使用MS docs https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-stringshttps://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings

Private err As New ErrorProvider()
Private d As Decimal 'In case you want to use the value as a number somewhere else
Private Sub TextBox17_Validating(sender As Object, e As CancelEventArgs) Handles TextBox17.Validating
    If Not Decimal.TryParse(TextBox17.Text, d) Then
        e.Cancel = True
        err.SetError(TextBox17, "This text box must contain a number.")
    Else
        err.Clear()
    End If
End Sub
Private Sub TextBox17_Validated(sender As Object, e As EventArgs) Handles TextBox17.Validated
    TextBox17.Text = d.ToString("C")
End Sub