2010-09-29 33 views
7

Có ai biết phương pháp chuyển đổi các từ như "đầu tiên", "thứ mười" và "một phần trăm" sang số tương đương của chúng không?Có phương pháp đơn giản nào để chuyển đổi chuỗi số thứ tự sang giá trị số phù hợp không?

Samples: "đầu tiên" -> 1, "thứ hai" -> 2, "mười" -> 10, "trăm" -> 100

Bất kỳ thuật toán sẽ đủ nhưng tôi đang viết điều này trong C#.

EDIT

Nó không đẹp và chỉ hoạt động với một từ tại một thời điểm nhưng nó phù hợp với mục đích của tôi. Có thể ai đó có thể cải thiện nó nhưng tôi hết thời gian.

public static int GetNumberFromOrdinalString(string inputString) 
    { 
     string[] ordinalNumberWords = { "", "first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth", "eleventh", "twelfth", "thirteenth", "fourteenth", "fifteenth", "sixteenth", "seventeenth", "eighteenth", "nineteenth", "twentieth" }; 
     string[] ordinalNumberWordsTens = { "", "tenth", "twentieth", "thirtieth", "fortieth", "fiftieth", "sixtieth", "seventieth", "eightieth", "ninetieth" }; 
     string[] ordinalNumberWordsExtended = {"hundredth", "thousandth", "millionth", "billionth" }; 

     if (inputString.IsNullOrEmpty() || inputString.Length < 5 || inputString.Contains(" ")) return 0; 

     if (ordinalNumberWords.Contains(inputString) || ordinalNumberWordsTens.Contains(inputString)) 
     { 
      var outputMultiplier = ordinalNumberWords.Contains(inputString) ? 1 : 10; 
      var arrayToCheck = ordinalNumberWords.Contains(inputString) ? ordinalNumberWords : ordinalNumberWordsTens; 

      // Use the loop counter to get our output integer. 
      for (int x = 0; x < arrayToCheck.Count(); x++) 
      { 
       if (arrayToCheck[x] == inputString) 
       { 
        return x * outputMultiplier; 
       } 
      } 
     } 

     // Check if the number is one of our extended numbers and return the appropriate value. 
     if (ordinalNumberWordsExtended.Contains(inputString)) 
     { 
      return inputString == ordinalNumberWordsExtended[0] ? 100 : inputString == ordinalNumberWordsExtended[1] ? 1000 : inputString == ordinalNumberWordsExtended[2] ? 1000000 : 1000000000; 
     } 

     return 0; 
    } 
+0

Ý của bạn là, chuyển đổi một cái gì đó như : '231' đến' 1 + 30 + 200'? – Ruel

+0

@Ruel, không, tôi nghĩ rằng OP có nghĩa là 1 -> "đầu tiên", 10 -> "thứ mười", 100 -> "một phần trăm" –

+0

mức độ cao bạn muốn đi với điều này? – BlackICE

Trả lời

2

Tôi chưa bao giờ đưa ra nhiều suy nghĩ vượt ra ngoài tôi biết từ "và" được cho là chuyển đổi từ số nguyên sang số thập phân. Giống như

Một Trăm Chín mươi chín đô la và Mười Cents

không

Một trăm chín mươi chín đô la.

Bất kỳ giải pháp tiềm năng nào cũng sẽ phải phân tích cú pháp chuỗi đầu vào, tăng bất kỳ ngoại lệ nào hoặc trả về giá trị.

Nhưng trước tiên bạn phải biết "các quy tắc" Đây có vẻ là rất độc đoán và dựa trên truyền thống nhưng người đàn ông này có vẻ như tốt một nơi như bất kỳ để bắt đầu:

Ask Dr. Math

+0

Nếu bạn làm cho nó là một quy tắc "và" chỉ được sử dụng trong quá trình chuyển đổi sang số thập phân thì bạn sẽ có cả đống vấn đề khi bạn cố gắng bán phần mềm của mình trong Thế giới Cũ! Ở Anh, chúng ta thường nói "một trăm một bảng Anh và mười chín xu", hay thậm chí là "hai trăm sáu ngày cho đến ngày sinh nhật của tôi" - "một trăm một" âm thanh rất Mỹ cho chúng ta. – AAT

+0

Yup, cơ sở tùy ý và truyền thống. Cảm ơn các ngôn ngữ tuyệt vời btw. Chúng tôi chỉ phải thực hiện một vài thay đổi đối với nó. :-) –

0

Tôi nghĩ bạn có thể sẽ phải ánh xạ các chuỗi tới các giá trị lên đến phạm vi tối đa mà bạn mong đợi và sau đó phân tích cú pháp chuỗi theo thứ tự và đặt các giá trị như vậy. Vì có rất ít quy ước đặt tên thông thường trên và theo thứ tự độ lớn, tôi không nghĩ rằng có một cách thanh lịch hoặc dễ dàng để phân tích một từ để có được giá trị số của nó. May mắn thay, tùy thuộc vào định dạng, bạn có thể chỉ phải ánh xạ mọi thứ tự độ lớn. Ví dụ: nếu bạn chỉ mong đợi các con số 0-100 và chúng được nhập là "chín mươi chín" thì bạn chỉ cần ánh xạ 0-9, sau đó 10-100 trong các bước của 10.

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