Вам необходимо преобразовать значение из строки в десятичную.Вы можете использовать функцию преобразования типов CDec
decprice = CDec(ListBox2.Items(i).ToString)
или метод TryParse для десятичного числа
Decimal.TryParse(ListBox2.Items(i).ToString, decprice)
У вас есть несколько проблем с вашей программой, которые необходимо решить.Одна проблема с вашей программой заключается в цикле Do While внутри вашего Button1_Click Sub.Если одна из строк либо strShirt, либо strPrice пуста, вы устанавливаете для blnmore значение False, чтобы цикл не выполнялся снова, но вы все равно добавляете строковые значения в поля списка независимо от того, были они пустыми или нет.Вы должны изменить свой код на строки в списках только в том случае, если они имеют значения:
If strShirt = String.Empty OrElse strprice = String.Empty Then
blnmore = False
Else
ListBox1.Items.Add(strShirt & " " & strprice)
ListBox2.Items.Add(strprice)
End If
Также ваша функция getdiscountsprice ожидает целое число, а вы передаете ему десятичное число.Функция возвращает десятичное число, и вы ничего не делаете с этим возвращаемым значением, например, сохраняете его или распечатываете.Вы должны преобразовывать значение списка в десятичное число до вызова getdiscountsprice, а не после.TryParse возвращает логическое значение, указывающее, что если оно прошло успешно, вы, вероятно, захотите вызывать getdiscounts price только при наличии действительного десятичного значения.
If Decimal.TryParse(ListBox2.Items(i).ToString, decprice) Then
getdiscountedprice(decprice)
End If