2017-04-10 45 views
0

我想數字轉換具有小數點(貨幣)轉換Word數帶有小數(貨幣),以字

例:12345.60 - > 12345美元和六十美分

我得到這個代碼 http://www.csharp-tutorials.info/2016/04/convert-numbers-to-words-in-c.html

public static string NumberToWords(int number) 
    { 
     if (number == 0) 
      return "zero"; 

     if (number < 0) 
      return "minus " + NumberToWords(Math.Abs(number)); 

     string words = ""; 

     if ((number/1000000000) > 0) 
     { 
      words += NumberToWords(number/1000000000) + " billion "; 
      number %= 1000000000; 
     } 

     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 += " "; 

      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; 
    } 

它的工作完全罰款整數,但如果輸入雙.. 它顯示錯誤

因爲它只接受int。

我盡力用我的知識,但我不能改變的代碼來獲得我想要的東西..

+1

如何服用'Math.Floor()'值,減去從十進制(這些信息存儲在一個變量,如* XX *),並通過運行整數你已有的功能。然後追加* xx *美分(或任何分數貨幣單位)到最後。 – Adam

回答

2

的問題是,你使用模上雙打,這是(顯然)不允許的。 您必須使用Math.Floor(number),其中浮點數之前的部分爲給定的代碼,浮點數之後的部分使用number - Math.Floor(number)。其餘部分實際上是在您的代碼示例中給出的,只需在浮點數之前的部分之後添加"Dollar",然後在浮點之後的部分之後添加"cents"。您的代碼看起來somwhat這樣的:

public static string NumberToWords(double doubleNumber) 
    { 
     var beforeFloatingPoint = (int) Math.Floor(doubleNumber); 
     var beforeFloatingPointWord = $"{NumberToWords(beforeFloatingPoint)} dollars"; 
     var afterFloatingPointWord = 
      $"{SmallNumberToWord((int) ((doubleNumber - beforeFloatingPoint) * 100), "")} cents"; 
     return $"{beforeFloatingPointWord} and {afterFloatingPointWord}"; 
    } 

    private static string NumberToWords(int number) 
    { 
     if (number == 0) 
      return "zero"; 

     if (number < 0) 
      return "minus " + NumberToWords(Math.Abs(number)); 

     var words = ""; 

     if (number/1000000000 > 0) 
     { 
      words += NumberToWords(number/1000000000) + " billion "; 
      number %= 1000000000; 
     } 

     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; 
     } 

     words = SmallNumberToWord(number, words); 

     return words; 
    } 

    private static string SmallNumberToWord(int number, string words) 
    { 
     if (number <= 0) return words; 
     if (words != "") 
      words += " "; 

     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; 
    }