Отображать запятые для больших чисел в одном текстовом поле калькулятора - PullRequest
0 голосов
/ 03 марта 2019

У меня есть текстовое поле, в котором отображаются цифры и операторы при нажатии соответствующей кнопки на калькуляторе, а затем при нажатии кнопки = результаты.

Проблема в том, что я пытаюсь заставить его отображать запятые, когдаЧисла более 999,99 и рассчитать их.Он отлично работает с одним числом с запятыми, но не с другим, только с теми, у кого его нет (если они вводятся последними). ​​

Например:

1,111 + 33333 (works in calculation)
1,111 + 22,222 (doesn't work)
33333 + 1,111 (doesn't work either)

Вот немного моегокод:

Private Sub ButtonClickMethod(sender As Object, e As EventArgs) Handles Button0.Click, Button1.Click, Button2.Click, Button3.Click, PlusButton.Click, EqualButton.Click
Dim button As Button = CType(sender, Button)

    'numbers
    If button.Name = "Button0" Then
        TextBox.Text = TextBox.Text + "0"
    End If
    If button.Name = "Button1" Then
        Dim val1 As String
        val1 = TextBox.Text + "1"
        TextBox.Text = val1
        TextBox.Text = Convert.ToDecimal(val1).ToString("#,##")
    End If
    If button.Name = "Button2" Then
        Dim val2 As String
        val2 = TextBox.Text + "2"
        TextBox.Text = val2
        TextBox.Text = Convert.ToDecimal(val2).ToString("#,##")
    End If
    If button.Name = "Button3" Then
        TextBox.Text = TextBox.Text + "3"
    End If
    'operations
    If button.Name = "PlusButton" Then
        TextBox.Text = TextBox.Text + "+"
    End If
    'equal/result
    If button.Name = "EqualButton" Then
        Dim equation As String = TextBox.Text.Replace(",", String.Empty)
        Dim results = New DataTable().Compute(equation, Nothing)
        TextBox.Text = results
    End If
End Sub

1 Ответ

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

Проблема в том, что после нажатия оператора + текстовое поле может содержать два числа.Если вы хотите отформатировать их, вам нужно разделить строку на 1-е число, оператор и 2-е число и отформатировать два числа отдельно.val1 и val2 могут содержать что-то вроде "13.2+5" и не могут быть преобразованы с помощью ToDecimal.

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

Текстовое поле должно использоваться только для отображения, а не в качестве хранилища для ввода.

Private _input As String

Private Sub TypeDigit(ByVal key As Char)
    _input += key
    Display()
End Sub

Private Sub TypeOperator(ByVal key As Char)
    _input += " " & key & " "
    Display()
End Sub

Private Sub Execute(ByVal key As Char)
    Select Case key
        Case "="c
            _input = Calculate(_input)
        Case "C"c
            _input = ""
        Case Else
    End Select

    Display()
End Sub

Нам все еще нужно объявить два метода Calculate и Display.Обратите внимание, что у нас есть 3 метода ввода.Каждый из них звонит Display в конце.Display выполнит все форматирование и поместит результат в текстовое поле.

Обработчики событий щелчка:

Private Sub buttonClear_Click(ByVal sender As Object, ByVal e As EventArgs)
    Execute("C"c)
End Sub

Private Sub buttonDecimalPoint_Click(ByVal sender As Object, ByVal e As EventArgs)
    TypeDigit("."c)
End Sub

Private Sub button0_Click(ByVal sender As Object, ByVal e As EventArgs)
    TypeDigit("0"c)
End Sub

...

Private Sub button9_Click(ByVal sender As Object, ByVal e As EventArgs)
    TypeDigit("9"c)
End Sub

Private Sub buttonEquals_Click(ByVal sender As Object, ByVal e As EventArgs)
    Execute("="c)
End Sub

Private Sub buttonPlus_Click(ByVal sender As Object, ByVal e As EventArgs)
    TypeOperator("+"c)
End Sub

' other operators here...

Метод Display довольно сложный, потому что мы могли бы иметьотформатировать неполные числа.Например, числа, начинающиеся или заканчивающиеся десятичной точкой или числа, имеющие конечные нули.Мы должны обеспечить их сохранение во время форматирования.Я получил

Private Sub Display()
    Dim parts As String() = _input.Split(New Char() {" "c}, StringSplitOptions.RemoveEmptyEntries)
    Dim display As String = ""
    Dim n As Decimal

    For Each part As String In parts
        If part = "." Then
            display += "0."
        ElseIf part.EndsWith(".") AndAlso Decimal.TryParse(part.Substring(0, part.Length - 1), n) Then
            display += n.ToString("#,##0") & "."
        ElseIf Decimal.TryParse(part, n) Then
            Dim decimalPoint As Integer = part.IndexOf("."c)

            If decimalPoint >= 0 Then
                Dim numDecimals As Integer = part.Length - decimalPoint - 1
                display += n.ToString("#,##0." & New String("0"c, numDecimals))
            Else
                display += n.ToString("#,##0")
            End If
        Else
            display += " " & part & " "
        End If
    Next

    textBoxDisplay.Text = display
End Sub

Я не реализовал метод Calculate.Я оставляю это на ваше усмотрение.Вам придется начинать, как в методе Display, разбивая входные данные на части.

...