Ну, я слишком опаздывал на ответе для этого вопроса, но я работал немного сценария тестирования, который, кажется, работал очень хорошо на меня. Я использовал (простой, но ужасный, и большой) регулярное выражение для определения местоположения всех слов для меня. Выражение следующие:
(?<Value>(?:zero)|(?:one|first)|(?:two|second)|(?:three|third)|(?:four|fourth)|
(?:five|fifth)|(?:six|sixth)|(?:seven|seventh)|(?:eight|eighth)|(?:nine|ninth)|
(?:ten|tenth)|(?:eleven|eleventh)|(?:twelve|twelfth)|(?:thirteen|thirteenth)|
(?:fourteen|fourteenth)|(?:fifteen|fifteenth)|(?:sixteen|sixteenth)|
(?:seventeen|seventeenth)|(?:eighteen|eighteenth)|(?:nineteen|nineteenth)|
(?:twenty|twentieth)|(?:thirty|thirtieth)|(?:forty|fortieth)|(?:fifty|fiftieth)|
(?:sixty|sixtieth)|(?:seventy|seventieth)|(?:eighty|eightieth)|(?:ninety|ninetieth)|
(?<Magnitude>(?:hundred|hundredth)|(?:thousand|thousandth)|(?:million|millionth)|
(?:billion|billionth)))
Показанный здесь с разрывами строки для форматирования целей..
Так или иначе, мой метод должен был выполнить этот RegEx с библиотекой как PCRE и затем считать назад именованные соответствия. И это работало надо всеми различными примерами, перечисленными в этом вопросе, минус "Одна Половина", типы, поскольку я не включал их, но как Вы видите, не было бы трудно сделать так. Это решает много проблем. Например, это обращается к следующим объектам в исходном вопросе и других ответах:
Теперь, вместо того, чтобы сохранить этого монстра регулярного выражения в Вашем источнике, я рассматривал создание этого RegEx во времени выполнения, с помощью чего-то как следующее:
char *ones[] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve",
"thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};
char *tens[] = {"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};
char *ordinalones[] = { "", "first", "second", "third", "fourth", "fifth", "", "", "", "", "", "", "twelfth" };
char *ordinaltens[] = { "", "", "twentieth", "thirtieth", "fortieth", "fiftieth", "sixtieth", "seventieth", "eightieth", "ninetieth" };
and so on...
легкая часть здесь, мы только храним слова тот вопрос. В случае ШЕСТОГО Вы заметите, что нет записи для него, потому что это просто, это - нормальное число с TH, прикрепляемым на... Но как ДВЕНАДЦАТЬ потребностей другое внимание.
хорошо, поэтому теперь у нас есть код для создания нашего (ужасного) RegEx, теперь мы просто выполняем его на наших числовых строках.
Одна вещь, которую я рекомендовал бы, состоит в том, чтобы отфильтровать или съесть слово "И". Это не необходимо, и только приводит к другим проблемам.
Так, то, что Вы собираетесь хотеть сделать, установить функцию, которая передает именованные соответствия для "Величины" в функцию, которая смотрит на все возможные значения величины и умножает Ваш текущий результат на то значение величины. Затем Вы создаете функцию, которая смотрит на "Значение", названное соответствиями, и возвращает интервал (или независимо от того, что Вы используете), на основе значения, обнаруженного там.
Все соответствия ЗНАЧЕНИЯ ДОБАВЛЯЮТСЯ к Вашему результату, в то время как соответствия magnitutde умножают результат на значение mag. Так, Двести пятьдесят тысяч становится "2", тогда "2 * 100", тогда "200 + 50", тогда "250 * 1000", заканчиваясь с 250 000...
Только для забавы, я записал vbScript версию этого, и она работала отлично со всеми обеспеченными примерами. Теперь, это не поддерживает названные соответствия, таким образом, я должен был работать немного более трудное получение корректного результата, но я получил его. Нижняя строка, если это - соответствие "ЗНАЧЕНИЯ", добавьте его Ваш аккумулятор. Если это - соответствие величины, умножьте свой аккумулятор на 100, 1000, 1000000, 1000000000, и т.д... Это предоставит Вам некоторые довольно удивительные результаты и все, что необходимо сделать для корректировки для вещей как "одна половина", добавляют их к RegEx, вставляют маркер кода для них и обрабатывают их.
ну, я надеюсь, что это сообщение помогает КОМУ-ТО там. Если кто-либо хочет, я могу отправить vbScript псевдо кодом, что я раньше тестировал это с, однако, это не симпатичный код и НЕ производственный код.
, Если я могу.. Каков заключительный язык, в котором это будет записано? C++ или что-то как язык в виде сценария? Источник Greg Hewgill будет иметь большое значение в помощи, понимают, как все это объединяется.
Сообщенный мне, если я могу иметь какую-либо другую справку. Извините, я только знаю английский язык/Американца, таким образом, я не могу помочь Вам с другими языками.
options, args = parser.parse_args()
option_dict = vars(options)