Существует ли простой метод преобразования порядковой числовой строки в соответствующее ей числовое значение? - PullRequest
7 голосов
/ 29 сентября 2010

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

Образцы: «первый» -> 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;
    }

Ответы [ 2 ]

2 голосов
/ 29 сентября 2010

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

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

не

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

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

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

Спросите доктора Math

0 голосов
/ 29 сентября 2010

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

...