Проблема в том, что после нажатия оператора +
текстовое поле может содержать два числа.Если вы хотите отформатировать их, вам нужно разделить строку на 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
, разбивая входные данные на части.