2017-02-01 8 views
0

Как преобразовать строку, которая задает число (например, «четыре») целому числу? В итоге я пытаюсь изменить «четыре» на 4. Диапазон чисел, которые мне нужно преобразовать, составляет от 1 до 99. Число более девяти будет иметь тире (пример: двадцать пять).Преобразование числа в строковой форме в целое число в схеме

Что я пробовал, строка-> число, но это возвращает false. Я не уверен, что еще попробовать.

Пожалуйста, помогите.

+0

все, что я мог придумать, было строка-> число «четыре» – raffi

+0

Я не могу думать о другом способе сделать это иначе, чем определить 99 терминов – raffi

+0

Это не так просто, как вот хороший ответ на питоне, который, возможно, вы можете преобразовать в схему http://stackoverflow.com/a/493788/6328256, и вот вопрос, который идет по общему алгоритму http://stackoverflow.com/questions/70161/how-to-read-values-from -numbers-written-as-words – shash678

ответ

0

Вот один из способов преобразования номера из своей формы строки в целом число вида:

(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).

+0

Привет, спасибо за помощь. Я также понял, как это сделать, но вместо того, чтобы использовать список, я определил один и тот же набор чисел, которые вы сделали, и я также использовал (con, чтобы установить числа, равные равным. Затем я переключаю строку im пытается скрыть до номера символом и использовать равный? Для сравнения и если там то же самое я называю номером Ито равным. Но ваш путь определенно намного быстрее и проще :) – raffi

0

Вот интересное решение:

(define count 
    (lambda (limit) 
    (let loop ((i 0)) 
     (let ((number (format #f "~r" i))) 
     (if (equal? number limit) 
      i 
      (loop (+ i 1))))))) 
+0

Это больше похоже на общий формат Lisp', чем на схему или ракетку 'format'. – molbdnilo

+0

@molbdnilo К сожалению, вы правы. Я не заметил тег Racket. Должен ли я удалить свой ответ? –