Как я могу сделать так, чтобы TextBox динамически корректировал ввод как формат валюты? - PullRequest
0 голосов
/ 23 марта 2019

Это приложение, которое я разрабатываю, имеет TextBox с именем 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.

Я ожидаю, что вход -q1w234 .... 5678 вернет выход 1234,56, но фактический вывод после потери фокуса000,000,001,234.56

Это кажется более сложным исправлением, потому что я не хочу использовать событие LostFocus для проверки того, что я печатаю.Я хочу, чтобы событие KeyPress обрабатывало ввод и динамически форматировало то, что я печатаю.

В этом случае:

Вход 1 будет иметь выход 1.00

Вход 123.4 будетиметь вывод 123.40

Вход 1234.567 будет иметь выход 1234.56

Все это без необходимости в событии LostFocus, но сейчас я использую событие LostFocus, потому что это все мои очень ограниченные знанияпозволяет мне делать.

ОБНОВЛЕНИЕ

Хорошо, я сейчас использую событие Leave, но опять же, я использовал только LostFocus в качестве заполнителя, потому что в конце я хочу, чтобы TextBox отрегулировал то, чтопользователь печатает по мере ввода.

1 Ответ

0 голосов
/ 24 марта 2019

Альтернативный способ обработки.Для получения подробной информации о форматировании чисел для отображения попробуйте MS docs https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings или https://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
...