2010-04-28 24 views
51

thể trùng lặp:
How can I convert an integer into its verbal representation?chuyển đổi số liệu trong lời nói C#

Ai có thể cho tôi một mã mồi tôi có thể làm việc trên trong việc chuyển đổi số thành chữ?

số Chuyển đổi sang chữ (dao động -1.000-1000) dụ: 1000 -> một nghìn

+15

giống như bài tập về nhà –

+0

Khi chuyển đổi số thành chuỗi? Hoặc chuyển đổi các số thành các biểu diễn từ của số đó, ví dụ: 2030 = hai nghìn ba mươi? – froadie

+0

Bạn đã thực hiện tìm kiếm trước chưa?=/ – Jens

Trả lời

-5

Bạn thực sự cần phải cung cấp thêm chi tiết về những gì bạn có ý nghĩa. Bạn có nghĩa là "từ" hoặc "chuỗi" không?

Ví dụ, nếu bạn muốn chuyển đổi một số thành một chuỗi, sau đó bạn muốn chỉ cần một cái gì đó như thế này:

int i = 123; 
string text = i.ToString(); 

Trong thực tế, bạn thậm chí có thể làm điều này:

(123).ToString(); // u need to put number in parenthesis 

và thậm chí

(123.5).ToString(); // this always trips me out 

Tuy nhiên, nếu bạn cần phải chuyển đổi 123 vào one hundred twenty three, sau đó bạn cần phải phân tích cú pháp nhiều hơn. Bạn sẽ phải chia số lượng thành các phần của nó, như hàng trăm phần mười, v.v.

Bạn có thể bắt đầu bằng cách nhận độ dài chuỗi (đối với int) để tìm ra nơi bắt đầu phân tích. Ví dụ, 123 có 3 chữ số, vì vậy hãy để N = 3 và i = 1. Tiếp theo bạn sẽ bắt đầu bằng cách chia 123 cho 10 (Ni), hoặc 100. Điều này cung cấp cho bạn 1. Bây giờ bạn biết rằng từ đó sẽ bắt đầu bằng "một hàng trăm ". Sau đó tăng i, trừ số đó (100) và chia cho 10 (N-i), hoặc 10 - điều này cho bạn 2. Làm điều này cho đến khi N == i.

Hy vọng điều này sẽ hữu ích. Bạn thực sự nên chỉnh sửa câu hỏi của mình.

+0

@Juan: ok, bây giờ tôi thấy bạn đã chỉnh sửa câu hỏi của bạn. Tôi nghĩ câu trả lời của tôi sẽ giúp bạn đi đúng hướng. – Dave

+0

nhưng có một vấn đề. Ví dụ, nếu bạn đã có số với 5 chữ số hoặc 6 chữ số, ... phương pháp của bạn không hoạt động. Ví dụ, 12341 trong số này chúng ta nên có mười hai nghìn và ... nhưng phương pháp của bạn không thể nói mười hai nghìn. – Martin

+0

@Martin True. Nhưng có một cách trả lời tốt hơn rồi. – Dave

1

Khi tôi phải giải quyết vấn đề này, tôi đã tạo một từ điển dữ liệu được mã hóa cứng để ánh xạ giữa các số và các từ liên quan của chúng. Ví dụ, sau đây có thể đại diện cho một vài mục trong từ điển:

{1, "one"} 
{2, "two"} 
{30, "thirty"} 

Bạn thực sự chỉ cần phải lo lắng về số bản đồ trong 10^0 (1,2,3, vv) và 10^1 (10,20,30) vị trí bởi vì một khi bạn nhận được đến 100, bạn chỉ cần biết khi nào sử dụng các từ như trăm, nghìn, triệu, vv kết hợp với bản đồ của bạn. Ví dụ, khi bạn có một số mặt hàng như 3.240.123, bạn nhận được: ba triệu hai trăm bốn mươi một trăm hai mươi ba .

Sau khi bạn xây dựng bản đồ của mình, bạn cần phải làm việc thông qua từng chữ số trong số của bạn và tìm ra danh mục phù hợp để đi cùng với nó.

161
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; 
} 
+0

làm cho nó một phương pháp mở rộng gọn gàng, nếu bạn không nhớ .. – nawfal

+0

@nawfal: đệ quy đến NumberToWords là không chính xác sau khi chỉnh sửa của bạn. –

+3

@tomp Tôi đã quay lại phiên bản trước, không phải vì tôi không thể sửa lỗi đánh máy, nhưng đó là phương pháp mở rộng trên int cho giao diện không đẹp này .. – nawfal

Các vấn đề liên quan