Я играл вокруг с синтаксическим анализатором ШТЕПСЕЛЯ, чтобы сделать то, что Вы хотели (и может отправить это как отдельный ответ позже), когда я заметил, что существует очень простой алгоритм, который делает удивительно хорошее задание со стандартными формами чисел на английском, испанском и немецком языке, по крайней мере.
Работа с английским языком, например, Вам нужен словарь, который отображает слова на значения очевидным способом:
"one" -> 1, "two" -> 2, ... "twenty" -> 20,
"dozen" -> 12, "score" -> 20, ...
"hundred" -> 100, "thousand" -> 1000, "million" -> 1000000
... и т.д
алгоритм справедлив:
total = 0
prior = null
for each word w
v <- value(w) or next if no value defined
prior <- case
when prior is null: v
when prior > v: prior+v
else prior*v
else
if w in {thousand,million,billion,trillion...}
total <- total + prior
prior <- null
total = total + prior unless prior is null
, Например, это прогрессирует следующим образом:
total prior v unconsumed string
0 _ four score and seven
4 score and seven
0 4
20 and seven
0 80
_ seven
0 80
7
0 87
87
total prior v unconsumed string
0 _ two million four hundred twelve thousand eight hundred seven
2 million four hundred twelve thousand eight hundred seven
0 2
1000000 four hundred twelve thousand eight hundred seven
2000000 _
4 hundred twelve thousand eight hundred seven
2000000 4
100 twelve thousand eight hundred seven
2000000 400
12 thousand eight hundred seven
2000000 412
1000 eight hundred seven
2000000 412000
1000 eight hundred seven
2412000 _
8 hundred seven
2412000 8
100 seven
2412000 800
7
2412000 807
2412807
И так далее. Я не говорю, что это идеально подходит, но для быстрого и грязного, это вполне успевает.
<час>Обращение к Вашему определенному списку на редактировании:
, Номер 6 является единственным, у меня нет готового ответа для, и поэтому неоднозначности между ординалами и частями (на английском языке, по крайней мере) добавленным к тому, что моя последняя чашка кофе была многие несколько часов назад.
Проверьте эту статью: http://www.fourcc.org/fccyvrgb.php Преобразование довольно простое, поэтому вы, вероятно, могли бы написать свою собственную функцию на основе этого
Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128