Проблема несоответствия текстового поля и метки! vb6

#validation #textbox #vb6 #label #currency

Вопрос:

введите описание изображения здесьЯ пытался изменить код, но это не сработало. Вот мой код:

 Private Sub CTcash_KeyPress(KeyAscii As Integer)
    If KeyAscii = 13 Then
        bill = Val(CTcash.Text - CLtotaloutput.Caption)
        If Val(bill) > 0 Then
            Change.CLchange.Caption = Val(bill)
            Change.CLchange.Caption = Format(bill, "Rp. ###,###,###.-")
            Change.Show
        End If
        If Val(bill) < 0 Then
            MsgBox "Not Enough Money", vbOKOnly, "Invalid"
        End If
    End If
End Sub
 

Выделенный код

 bill = Val(CTcash.Text - CLtotaloutput.Caption)
 

Ответ №1:

Оба CTcash.Текст и вывод CLTotaloutput.Подписи-это текстовые строки, поэтому вы не можете вычесть их напрямую. Попробуй:

 bill = Val(CTcash.text) - Val(CLtotaloutput.Caption)
 

Вы действительно должны убедиться, что обе строки являются числовыми в первую очередь!

Комментарии:

1. Это правильно, но Val будет анализировать только целые числа и возвращать 0, если их нет или они находятся в конце строки. Ошибки не будет, если строки не являются числовыми.

2. @eglease Вот почему я добавил свое последнее предложение!

3. Он работает не идеально, он продолжает показывать значение Val(CTcash.text) при изменении. CLchange. Подпись idk почему? Я пробовал этот код раньше, но я его меняю ( bill = Val(CTcash.text) - Val(CLtotaloutput.Caption) )

4. Что именно это не показывает правильно? Может ли быть проблема с форматированием? Я получаю странное форматирование, но правильные ответы при тестировании.

5. Хммм, Я форматирую вывод Cltotal. Подпись к «Rp. ###,###,###.-«. Я думаю, что в этом и заключается проблема

Ответ №2:

@Джон Исон прав. Вам также не нужно использовать Val on bill , так как это уже целое число. И вы ничего не делаете, если счет равен 0, но это может быть нормально в зависимости от ваших требований.

 Private Sub CTcash_KeyPress(KeyAscii As Integer)
    If KeyAscii = 13 Then
        bill = Val(CTcash.Text) - Val(CLtotaloutput.Caption)
        If bill > 0 Then ' Note that when bill is 0 nothing happens but that might be fine
            'Change.CLchange.Caption = bill 'Not sure why this is needed but it may be
            Change.CLchange.Caption = Format(bill, "Rp. ###,###,###.-")
            Change.Show
        End If
        If bill < 0 Then
            MsgBox "Not Enough Money", vbOKOnly, "Invalid"
        End If
    End If
End Sub
 

Я думаю, что лучшим подходом было бы использовать Select Case утверждение.

 Private Sub CTcash_KeyPress(KeyAscii As Integer)
    If KeyAscii = 13 Then
        bill = Val(CTcash.Text) - Val(CLtotaloutput.Caption)

        Select Case True
            Case bill > 0 
               Change.CLchange.Caption = Format(bill, "Rp. ###,###,###.-")
               Change.Show 
            Case bill < 0
               MsgBox "Not Enough Money", vbOKOnly, "Invalid"
            Case Else
               ' Do nothing - this documents that this is done on purpose
        End Select
     
    End If
End Sub
 

Вы можете использовать IsNumeric функцию, чтобы проверить, являются ли входные данные числовыми, и выполнить соответствующий анализ. Используйте эту Right функцию, чтобы удалить все не-числа с левой стороны. Например, Right("$123", Len("$123") - 1) удалит ведущую $ .

Чтобы удалить все нечисловые значения из строки:

 Dim ResultString As String
myString = "aaa34BB12,000xcv9.9zz"

Dim i As Integer

For i = 1 To Len(myString)
    myChar = Mid(myString, i, 1)
    If IsNumeric(myChar) = True Then
        ResultString = ResultString   myChar
    End If
Next

MsgBox ResultString
 

Обратите внимание, что это может вызвать проблему с десятичными суммами, так как 1.23 будет перед 123. Не то, чего ты хочешь. Попробуйте воспользоваться этой CCur функцией. Я сам никогда им не пользовался, но, возможно, это именно то, что вам нужно.

Источник: https://www.vbforums.com/showthread.php?437526-RESOLVED-Removing-non-numeric-chars-from-a-stringamp;p=2686411amp;viewfull=1#post2686411

Комментарии:

1. Ваш код, похоже, VB.Net, а не VB6, так как Q помечен

2. Это VB6 с тех пор, как я запустил его в Visual studio 6.

3. Извините, нет. OrElse , например, это не конструкция VB6

4. Ты прав. Я думал, вы имели в виду пример ответа с Val использованием. Последний код, который я только что скопировал из примера vbforum, отсюда ссылка, в качестве примера того, что можно сделать для удаления не-чисел.

Ответ №3:

Сначала я скучаю по константе, я помещаю ее в другую подложку:

 Private Sub CTcash_KeyPress(KeyAscii As Integer)
    If KeyAscii = 13 Then
        bill = Val(CTcash.Text) - totalsum
        Select Case True
            Case bill > 0
               Change.CLchange.Caption = Format(bill, "Rp. ###,###,###.-")
               Change.Show
            Case bill < 0
               MsgBox "Not Enough Money", vbOKOnly, "Invalid"
            Case Else
        End Select
    End If
End Sub
 
 Private Sub CTbarcode_KeyUp(KeyCode As Integer, Shift As Integer)
    Select Case KeyCode
        Case Is = vbKeyF6
            totaldiscount = 200
            totalsum = Val(CLsuboutput.Caption) - totaldiscount
            CLtotaloutput.Caption = Format(totalsum, "Rp. ###,###,###. ,-")
            CLdiscoutput.Caption = Format(totaldiscount, "Rp. ###,###,###. ,-")
            CTcash.Enabled = True
            CTcash.SetFocus
    End Select
End Sub
 

Вот оно после того, как я его отредактирую:

 Private Sub CTcash_KeyPress(KeyAscii As Integer)
    If KeyAscii = 13 Then
        totaldiscount = 200
        totalsum = Val(CLsuboutput.Caption) - totaldiscount
        bill = Val(CTcash.Text) - totalsum
        Select Case True
            Case bill > 0
               Change.CLchange.Caption = Format(bill, "Rp. ###,###,###.-")
               Change.Show
            Case bill < 0
               MsgBox "Not Enough Money", vbOKOnly, "Invalid"
            Case Else
        End Select
    End If
End Sub