2015-12-02 4 views
2

Я работаю над проектом, который преобразует денежные ценности в слова. Я нашел код, который помогает мне с этим преобразованием (а также реализует некоторые части из предыдущего вопроса), и код работает отлично и делает то, что мне нужно ... НО проблема, которую я получаю, это то, что 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 
+1

Установили ли вы точку останова при двух вызовах ToString() в numToString? Мое первоначальное предположение - округление происходит там. Поскольку вы делаете это как деньги, вы можете передать строку формата в качестве аргумента, который позволяет вам сохранять десятичные знаки. –

+1

Похоже, что значение изменяется с помощью вызова Modulus в функции hundredConvert. Мод является требованием программы (проект класса). Может, что-то мне не хватает? http://imgur.com/Nrym9qy –

+2

Возможно, VB скрывает от вас какое-то округление, хотя из того, что я помню, мода должна работать с десятичной точкой. При этом попробуйте сделать mod после вызова Math.Floor по количеству, пройденному. Это даст вам только целую часть без округления, если вы не работаете с отрицательными значениями, которые в этом случае вам не должно быть. Если вы хотите работать с отрицательными значениями, вам нужно будет рассмотреть Math.Truncate. –

ответ

1

Убедитесь, в этом случае, что вы называете Math.Floor на вашем десятичного значения перед вызовом mod. Это означает, что для неотрицательных значений вы получите округленную целую часть десятичной дроби, позволяющую преобразовать ее в текст. Удачи!

Смежные вопросы