Вот один из способов преобразования номера из своей формы строки в целом число вида:
(define (string->num string)
(define dict '(("one" 1) ("two" 2) ("three" 3) ("four" 4) ("five" 5)
("six" 6) ("seven" 7) ("eight" 8) ("nine" 9) ("ten" 10)
("eleven" 11) ("twelve" 12) ("thirteen" 13) ("fourteen" 14)
("fifteen" 15) ("sixteen" 16) ("seventeen" 17) ("eighteen" 18)
("ninteen" 19) ("twenty" 20) ("thirty" 30) ("forty" 40)
("fifty" 50) ("sixty" 60) ("seventy" 70) ("eighty" 80)
("ninety" 90)))
(define (get-num str lst)
(cond [(empty? lst) 0]
[(equal? str (first (first lst)))
(second (first lst))]
[else (get-num str (rest lst))]))
(define str-lst (regexp-split #rx"-" string))
(define len (length str-lst))
(define base (get-num (first str-lst) dict))
(cond [(equal? len 1)
base]
[(equal? len 2)
(+ base (get-num (second str-lst) dict))]))
функция использует регулярное выражение расщепление, чтобы отделить строку на две нефессированные части, например. (regexp-split #rx"-" "twenty-four")
'("twenty" "four")
, и (regexp-split #rx"-" "one")
'("one")
. Идея состоит в том, чтобы использовать словарь (список списков) в качестве источника и искать значение строки, если одна строка, или искать значения обеих строк, если есть дефис. Если есть две строки, их значения добавляются, например. от '("twenty" "four")
, значения «двадцать» и «четыре» просматриваются, после чего они добавляются к возврату 24 (20 + 4).
все, что я мог придумать, было строка-> число «четыре» – raffi
Я не могу думать о другом способе сделать это иначе, чем определить 99 терминов – raffi
Это не так просто, как вот хороший ответ на питоне, который, возможно, вы можете преобразовать в схему http://stackoverflow.com/a/493788/6328256, и вот вопрос, который идет по общему алгоритму http://stackoverflow.com/questions/70161/how-to-read-values-from -numbers-written-as-words – shash678