2010-09-29 31 views
7

有沒有人知道一種方法將諸如「第一」,「第十」和「第一百」之類的單詞轉換爲它們的數字等價物?是否有一種將序數字串轉換爲其匹配數值的簡單方法?

樣品: 「第一」 - > 1, 「第二」 - > 2, 「第十」 - > 10, 「百」 - > 100

任何算法就足夠了,但我正在寫這在C#中。

編輯

這是不漂亮,只能用一個字工作在時間,但它適合我的目的。也許有人可以改進它,但我沒時間了。

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

您的意思是,將類似:'231'到'1 + 30 + 200'? – Ruel 2010-09-29 01:55:18

+0

@Ruel,不,我認爲OP的意思是1 - >「第一」,10 - >「第十」,100 - >「第一百」 – 2010-09-29 01:59:31

+0

你想用這個多高? – BlackICE 2010-09-29 02:02:41

回答

2

我從來沒有考慮過這麼多的想法,我知道單詞「和」應該是從整數到小數的過渡。像

一百九十九美元,十美分

一百九十九美元。

無論如何,任何可能的解決方案都必須解析輸入字符串,引發任何異常或以其他方式返回值。

但首先你必須知道的「規則」,這似乎是很隨意和基於傳統,但這位先生似乎好地方一樣開始:

Ask Dr. Math

+0

如果您規定「和」僅用於過渡到小數,那麼當您嘗試在舊世界銷售軟件時,您將遇到大量問題!在英國,我們通常會說「一百一十磅,十九便士」,甚至「直到我的生日還有兩百六十天」 - 「一百零一」對我們來說聽起來很美。 – AAT 2010-09-29 22:42:16

+0

是的,任意的和傳統的基礎。感謝偉大的語言順便說一句。我們只需對其進行一些更改即可。 :-) – 2010-09-29 22:55:21

0

我想您可能最終不得不將字符串映射到您希望的最大範圍內的值,然後按順序解析該字符串並將值放置。由於在整個量級內幾乎沒有常規的命名約定,我不認爲有一種優雅或簡單的方法來解析一個單詞來獲得它的數值。幸運的是,根據格式,你可能只需要映射每一個數量級。例如,如果您只希望數字0-100,並且它們輸入爲「九十九」,那麼您只需要映射0-9,然後以10步爲10-100來映射。

相關問題