简体   繁体   中英

VB.Net - Noncooperative decimal in string

I am writing a calculator WinForm in VB. I have a label used to display the output "Result". My problem comes when trying to add a "." to my label string. Example: I will type 355.5 and until the 5 is pressed after it, my string is showing up as .355 After the last 5 is pressed, it jumps into the correct location. I have exhausted my debugging skill and now am just going crazy. Anyone encounter this before?

Here's my entire code so far (ignore unfinished functions)

Public Class MyCalc

Private bDecFlag As Boolean
Private sMathOp As String

Private Sub ModeSel_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ModeSel.SelectedIndexChanged

    If ModeSel.SelectedIndex = 3 Then
        Me.Width = 360
    ElseIf ModeSel.SelectedIndex > 2 Then
        Me.Width = 590
    Else
        Me.Width = 250
    End If

    If ModeSel.SelectedIndex = 0 Then
        For iCount As Integer = 0 To 9
            Me.Controls("Digit" & iCount).Enabled = True
        Next
    End If

    If ModeSel.SelectedIndex = 1 Then
        For iCount As Integer = 2 To 9
            Me.Controls("Digit" & iCount).Enabled = False
        Next
    End If

    If ModeSel.SelectedIndex = 2 Then
        For iCount As Integer = 0 To 7
            Me.Controls("Digit" & iCount).Enabled = True
        Next
        Digit8.Enabled = False
        Digit9.Enabled = False
    End If

    If ModeSel.SelectedIndex = 3 Then
        For iCount As Integer = 0 To 9
            Me.Controls("Digit" & iCount).Enabled = True
        Next
        For iCount As Integer = Asc("A") To Asc("F")
            Me.Controls("Alpha" & Chr(iCount)).Enabled = True
        Next
        For iCount As Integer = Asc("G") To Asc("Z")
            Me.Controls("Alpha" & Chr(iCount)).Enabled = False
        Next
    End If

    If ModeSel.SelectedIndex = 4 Then
        For iCount As Integer = 0 To 9
            Me.Controls("Digit" & iCount).Enabled = True
        Next

        For iCount As Integer = Asc("A") To Asc("Z")
            Me.Controls("Alpha" & Chr(iCount)).Enabled = True
        Next
        AlphaA.Enabled = False
        AlphaE.Enabled = False
        AlphaI.Enabled = False
        AlphaO.Enabled = False
        AlphaU.Enabled = False
    End If

End Sub

Private Sub Digit0_Click(sender As System.Object, e As System.EventArgs) Handles Digit0.Click
    UpdateResult(0)
End Sub

Private Sub Digit1_Click(sender As System.Object, e As System.EventArgs) Handles Digit1.Click
    UpdateResult(1)
End Sub

Private Sub Digit2_Click(sender As System.Object, e As System.EventArgs) Handles Digit2.Click
    UpdateResult(2)
End Sub

Private Sub Digit3_Click(sender As System.Object, e As System.EventArgs) Handles Digit3.Click
    UpdateResult(3)
End Sub

Private Sub Digit4_Click(sender As System.Object, e As System.EventArgs) Handles Digit4.Click
    UpdateResult(4)
End Sub

Private Sub Digit5_Click(sender As System.Object, e As System.EventArgs) Handles Digit5.Click
    UpdateResult(5)
End Sub

Private Sub Digit6_Click(sender As System.Object, e As System.EventArgs) Handles Digit6.Click
    UpdateResult(6)
End Sub

Private Sub Digit7_Click(sender As System.Object, e As System.EventArgs) Handles Digit7.Click
    UpdateResult(7)
End Sub

Private Sub Digit8_Click(sender As System.Object, e As System.EventArgs) Handles Digit8.Click
    UpdateResult(8)
End Sub

Private Sub Digit9_Click(sender As System.Object, e As System.EventArgs) Handles Digit9.Click
    UpdateResult(9)
End Sub

Private Sub DecBut_Click(sender As System.Object, e As System.EventArgs) Handles DecBut.Click
    If bDecFlag = False Then
        If Result.Text = "0" Then
            Result.Text = "0."
            bDecFlag = True
        Else
            Result.Text = Result.Text + "."
            bDecFlag = True
        End If
    End If
End Sub

Private Sub ClrBut_Click(sender As System.Object, e As System.EventArgs) Handles ClrBut.Click
    Result.Text = 0
    bDecFlag = False
End Sub

Private Sub DelBut_Click(sender As System.Object, e As System.EventArgs) Handles DelBut.Click
    If Result.Text = "0" Then
    ElseIf Result.Text.Substring(Result.Text.Length - 1) = "." Then
        Result.Text = Result.Text.Substring(0, Result.Text.Length - 1)
        bDecFlag = False
    Else
        Result.Text = Result.Text.Substring(0, Result.Text.Length - 1)
        If Result.Text = "" Then
            Result.Text = "0"
        End If
    End If
End Sub

Private Sub MyCalc_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    Select Case e.KeyCode
        Case Keys.NumPad0
            Digit0_Click(Digit0, New EventArgs)
        Case Keys.NumPad1
            Digit1_Click(Digit1, New EventArgs)
        Case Keys.NumPad2
            Digit2_Click(Digit2, New EventArgs)
        Case Keys.NumPad3
            Digit3_Click(Digit3, New EventArgs)
        Case Keys.NumPad4
            Digit4_Click(Digit4, New EventArgs)
        Case Keys.NumPad5
            Digit5_Click(Digit5, New EventArgs)
        Case Keys.NumPad6
            Digit6_Click(Digit6, New EventArgs)
        Case Keys.NumPad7
            Digit7_Click(Digit7, New EventArgs)
        Case Keys.NumPad8
            Digit8_Click(Digit8, New EventArgs)
        Case Keys.NumPad9
            Digit9_Click(Digit9, New EventArgs)
        Case Keys.Back
            DelBut_Click(DelBut, New EventArgs)
        Case Keys.Decimal
            DecBut_Click(DecBut, New EventArgs)

    End Select
End Sub

Private Sub MyCalc_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    bDecFlag = False
End Sub

Public Sub UpdateResult(ByVal sNum As String)
    If Result.Text = "0" Then
        Result.Text = sNum
    Else
        Result.Text &= sNum
    End If
End Sub

End Class

So after the long debugging, I found out that you are using the Label/Textbox RightToLeft property set to yes . Nothing is wrong with it really, but it can't handle special characters including decimal points, commas, etc. properly. The workaround for this is to reverse what we have expected - to reverse the string concatenation.

Result.Text = "." & Result.Text 

Not seeing entire code I'm not exactly sure but I think there might be something wrong with string concatenation.
Try changing into this:

Result.Text = Result.Text & "."

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM