Я работаю над проектом, который преобразует денежные ценности в слова. Я нашел код, который помогает мне с этим преобразованием (а также реализует некоторые части из предыдущего вопроса), и код работает отлично и делает то, что мне нужно ... НО проблема, которую я получаю, это то, что Visual Basic продолжает округлять мое преобразование TEXT.Остановить округление при преобразовании чисел в слова
Первоначально у меня были переменные как парные, читал, что Десятичные числа имеют тенденцию сохранять значения и перемещают все в десятичные числа, но они все еще переводят мои слова вверх на один. Я также пытался удалить десятичное место до того, как какое-либо преобразование все равно произойдет, но текстовые слова все равно получат округление. Например, если я ввожу 14 508,85 в мой чек, конверсия текста выливается «Четырнадцать тысяч пятьсот девяток и 85/100»
Выполнение программы, похоже, что значение изменяется с помощью вызова модуля в Функция сотниКонверт. Мод является требованием программы (проект класса). Может, что-то мне не хватает? imgur.com/Nrym9qy
Спасибо за помощь!
Код следующим
Public Class Check
Dim checkValue As Decimal
Dim tempValue As Decimal
Dim result As String = ""
Dim temp As Decimal
Dim change As String = ""
Dim tempString As String = ""
Dim tempChange As Decimal
Private Function hundredsConvert(ByVal num As Decimal) As String
Static teens() As String = {"Zero", "One",
"Two", "Three", "Four", "Five", "Six", "Seven",
"Eight", "Nine", "Ten", "Eleven", "Twelve",
"Thirteen", "Fourteen", "Fifteen", "Sixteen",
"Seventeen", "Eightteen", "Nineteen"}
Static tens() As String = {"Twenty",
"Thirty", "Forty", "Fifty", "Sixty", "Seventy",
"Eighty", "Ninety"}
' If the number is 0, return an empty string.
If num = 0 Then Return ""
' Handle the hundreds digit.
Dim digit As Decimal
Dim result As String = ""
If num > 99 Then
digit = num \ 100
num = num Mod 100
result = teens(digit) & " Hundred"
End If
' If num = 0, we have hundreds only.
If num = 0 Then Return result.Trim()
' See if the rest is less than 20.
If num < 20 Then
' Look up the correct name.
result &= " " & teens(num)
Else
' Handle the tens digit.
digit = num \ 10
num = num Mod 10
result &= " " & tens(digit - 2)
' Handle the final digit.
If num > 0 Then
result &= " " & teens(num)
End If
End If
Return result.Trim()
End Function
Private Function numToString(ByVal num As Decimal) As String
'Get the change'
change = num.ToString
change = change.Substring(change.IndexOf(".") + 1) + "/100"
tempString = num.ToString
tempString.Remove(tempString.IndexOf(".") + 2)
num = Decimal.Parse(tempString)
Static groups() As String = {" ", "Thousand ", "Million",
"Billion", "Trillion", "Quadrillion", "?", "??",
"???", "????"}
Dim result As String = ""
'Process the groups, smallest first.'
Dim quotient As Decimal
Dim remainder As Decimal
Dim group_num As Decimal = 0
Do While num > 0
'Get the next group of three digits.'
quotient = num \ 1000
remainder = num Mod 1000
num = quotient
'Convert the group into words.'
result = hundredsConvert(remainder) &
" " & groups(group_num) &
result
'Get ready for the next group.'
group_num += 1
Loop
'Remove the trailing ", ".
If result.EndsWith(", ") Then
result = result.Substring(0, result.Length - 2)
End If
Return result
End Function
Private Sub btnSubmit_Click(sender As Object, e As EventArgs) Handles btnSubmit.Click
'Dim declarations'
'Convert check value from a text field to a double'
Try
checkValue = txtCheckAmount.Text
Catch ex As InvalidCastException
MessageBox.Show("You must enter a numbers to write a check.")
End Try
lblWrittenDollars.Text = numToString(checkValue) & "and " & change
If checkValue = 0 Then
MessageBox.Show("You must have some value in order to write a check.")
txtCheckAmount.Clear()
lblWrittenDollars.Text = ""
Else
Dim finalize = MessageBox.Show("You have specified that you want to write a check for " & checkValue & "?", "", MessageBoxButtons.YesNo)
If finalize = DialogResult.No Then
txtCheckAmount.Clear()
lblWrittenDollars.Text = ""
ElseIf finalize = DialogResult.Yes Then
End If
End If
checkValue = 0
End Sub
Private Sub btnClear_Click(sender As Object, e As EventArgs) Handles btnClear.Click
End Sub
Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
Me.Close()
End Sub
Private Sub txtPayOrderTo_TextChanged(sender As Object, e As EventArgs) Handles txtPayOrderTo.TextChanged
End Sub
End Class
Установили ли вы точку останова при двух вызовах ToString() в numToString? Мое первоначальное предположение - округление происходит там. Поскольку вы делаете это как деньги, вы можете передать строку формата в качестве аргумента, который позволяет вам сохранять десятичные знаки. –
Похоже, что значение изменяется с помощью вызова Modulus в функции hundredConvert. Мод является требованием программы (проект класса). Может, что-то мне не хватает? http://imgur.com/Nrym9qy –
Возможно, VB скрывает от вас какое-то округление, хотя из того, что я помню, мода должна работать с десятичной точкой. При этом попробуйте сделать mod после вызова Math.Floor по количеству, пройденному. Это даст вам только целую часть без округления, если вы не работаете с отрицательными значениями, которые в этом случае вам не должно быть. Если вы хотите работать с отрицательными значениями, вам нужно будет рассмотреть Math.Truncate. –