简体   繁体   English

VB.Net-不合作的十进制字符串

[英]VB.Net - Noncooperative decimal in string

I am writing a calculator WinForm in VB. 我正在VB中编写计算器WinForm。 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. 示例:我将键入355.5,直到按下5为止,我的字符串显示为.355。按下最后5个字符串后,它将跳到正确的位置。 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 . 因此,经过长时间的调试,我发现您正在使用Label / Textbox的RightToLeft属性设置为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 & "."

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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