2010-09-29 6 views
7

Кто-нибудь знает способ преобразования слов типа «первый», «десятый» и «один сотый» в их числовой эквивалент?Есть ли простой способ преобразования порядковой числовой строки в соответствующее числовое значение?

Образцы: "первый" -> 1, "второй" -> 2, "десятый" -> 10, "сотые" -> 100

Любой алгоритм будет достаточно, но я пишу это в C#.

EDIT

Это не красиво и работает только с одним словом, в то время, но это соответствует моим целям. Может быть, кто-то может это улучшить, но у меня нет времени.

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

+0

@Ruel, нет, я думаю, что OP означает 1 -> «первый», 10 -> «десятый», 100 -> «сотый» –

+0

, насколько высок вы хотите пойти с этим? – BlackICE

ответ

2

Я никогда не думал об этом выше. Я знаю, что слово «и» должно быть переходом от целых чисел к десятичным. Как

Сто девяносто девять долларов и десять центов

не

Сто девяносто девять долларов.

В любом случае любое потенциальное решение должно анализировать входную строку, поднять любые исключения или иным образом вернуть значение.

Но сначала вы должны знать «правила» Это, как представляется, весьма условны и основаны на традиции, но этот господин, кажется, столь же хорошее место как любой, чтобы начать:

Ask Dr. Math

+0

Если вы сделаете это правило, что «и» используется только при переходе к десятичным знакам, тогда у вас будет целая куча проблем при попытке продать свое программное обеспечение в Старом Свете! Здесь, в Великобритании, мы обычно говорим «сто И один фунт и девятнадцать пенсов», или даже «двести шесть дней до моего дня рождения» - «сто один» звучит очень американски для нас. – AAT

+0

Yup, произвольная и традиционная база. Спасибо за отличный язык. Нам нужно было сделать несколько изменений. :-) –

0

Я думаю, вам может потребоваться сопоставить строки с значениями до максимального ожидаемого диапазона, а затем разобрать строку по порядку и поместить значения как таковые. Поскольку существует очень мало регулярных соглашений об именах в пределах и в порядке величины, я не думаю, что есть элегантный или простой способ разобрать слово, чтобы получить его числовое значение. К счастью, в зависимости от формата вы, вероятно, должны отображать только каждый порядок. Например, если вы ожидаете только числа 0-100, и они вводятся как «девяносто девять», вам нужно всего лишь отобразить 0-9, затем 10-100 с шагом 10.

 Смежные вопросы

  • Нет связанных вопросов^_^