Convert number to words

despite the fact that this question was published and an answer was given. I need help with my code. The challenge is to convert the number into words from 0 to 10 million. I tried to do this using my code using a GUI, the problem is that it does not return an answer at all. Can someone help me in determining what might be the problem with the code.

below:

private void btnConvertToText_Click(object sender, EventArgs e) { string ConvertedNumber = " "; int number = Convert.ToInt32(txtNumber.Text); int Count = 0; string [] ones = {" One ", " Two ", " Three ", " Four ", " Five ", " Six ", " Seven ", " Eight ", " Nine "}; string [] teens= {" Eleven ", " Twelve ", " Thirteen ", " Fourtte n ", " Fifteen ", " Sixteen ", " Seventeen ", " Eighteen ", " Nineteen "}; string [] tens = {" Ten ", " Twenty ", " Thirty ", " Fourty ", " Fifty ", " Sixty ", " Seventy ", " Eighty ", " Ninenty "}; string [] moreThenTens = {" hundred ", " thousand ", " million "}; while (number >= 0) { if (number == 0) { ConvertedNumber = "Zero"; } else if (number < 10) { for (int Counter = 1; Counter < 10; Counter++) { ConvertedNumber += ones[Counter-1]; } } else if (number >= 10 && number < 100) { while (number > 10) { if (number > 10 && number < 20) { for (int x = 11; x < 20; x++) { if (number == x) { ConvertedNumber = teens[x - 11]; } } } else { number -= 10; Count++; } ConvertedNumber += tens[Count - 1]; } } else if (number >= 100 && number < 1000) { while (number > 100) { number -= 100; Count++; } ConvertedNumber += ones[Count - 1] + moreThenTens[0]; } else if (number >= 1000 && number < 10000) { while (number > 1000) { number -= 1000; Count++; } ConvertedNumber += ones[Count - 1] + moreThenTens[1]; } else if (number >= 10000 && number < 100000) { while (number > 10000) { if (number < 20000) { number -= 10000; Count++; } else if (number >= 20000) { number -= 10000; Count++; } } if (Count >= 1) { if (number < 1000) { ConvertedNumber += tens[0] + moreThenTens[1]; } else if (number >= 1000) { ConvertedNumber += teens[Count - 1] + moreThenTens[1]; } } else if (Count > 1) { ConvertedNumber += tens[Count - 1] + moreThenTens[1]; } } else if (number >= 100000 && number < 1000000) { while (number > 100000) { number -= 100000; Count++; } ConvertedNumber += ones[Count - 1] + moreThenTens[0] + moreThenTens[1]; } else if (number >= 1000000 && number < 10000000) { while (number > 1000000) { number -= 1000000; Count++; } ConvertedNumber += ones[Count - 1] + moreThenTens[2]; } else if (number == 10000000) { while (number > 10000000) { number -= 10000000; Count++; } ConvertedNumber += tens[0] + moreThenTens[2]; } } txtConvertedNumber.Text = ConvertedNumber; } } 
+6
source share
6 answers
 while (number >= 0) 

Your code seems to create an infinite loop. Take for example:

 if (number == 0) { ConvertedNumber = "Zero"; } 

This does not go out of your cycle and therefore never comes in

 txtConvertedNumber.Text = ConvertedNumber; 

Use a check to convert your number, for example:

 if (number == 0) { ConvertedNumber = "Zero"; number = -1; } 
+5
source

It may be useful.

 public static string NumberToWords(int number) { if (number == 0) return "Zero"; if (number < 0) return "Minus " + NumberToWords(Math.Abs(number)); string words = ""; if ((number / 1000000) > 0) { words += NumberToWords(number / 1000000) + " Million "; number %= 1000000; } if ((number / 1000) > 0) { words += NumberToWords(number / 1000) + " Thousand "; number %= 1000; } if ((number / 100) > 0) { words += NumberToWords(number / 100) + " Hundred "; number %= 100; } if (number > 0) { if (words != "") words += "and "; var unitsMap = new[] { "Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen" }; var tensMap = new[] { "zero", "Ten", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety" }; if (number < 20) words += unitsMap[number]; else { words += tensMap[number / 10]; if ((number % 10) > 0) words += "-" + unitsMap[number % 10]; } } return words; } 
+2
source

You should check if the number is zero before the while loop.

  if ( number == 0 ) ConvertedNumber= "Zero" ; 

Then change the time as follows

 while(number > 0) 
+1
source

this can help for decimal

 string[] number = Number1.ToString().Split('.'); String Word=NumberToWords(convert.toInt64(number[0])) + " AND " + NumberToWords(convert.toInt64(number[1])); 
+1
source

It seems to be stuck in a loop. I checked the teen number here, it seems like you forgot to reduce the number to zero or zero

  else if (number >= 10 && number < 100) { if(number > 10) { if (number > 10 && number < 20) { for (int x = 11; x < 20; x++) { if (number == x) { ConvertedNumber += teens[x - 11]; } } ***number -= 100;*** } else { number -= 10; Count++; ConvertedNumber += tens[Count - 1]; } } } 
0
source

This will also work and make your code easier to debug / execute.

 while (NumberExists(ConvertedNumber, number)) { ... } 

Put this method in the same nameSpace as btnConvertToText_Click .

  private static bool NumberExists(string convertedNumber, int number) { if (convertedNumber == " " && number != null) { return true; } else return false; } 

In general, I would suggest not adding magic numbers to your code, for example + 1s or -1s. This can make debugging a bit more difficult. If you need to do this to get something working, try to figure out why and rewrite it as soon as possible. Definitely before working on other methods.

0
source

Source: https://habr.com/ru/post/951002/


All Articles