Scheme 将字符串形式的数字转换为方案中的整数

Scheme 将字符串形式的数字转换为方案中的整数,scheme,racket,Scheme,Racket,如何将拼写为数字(例如“4”)的字符串转换为整数?总之,我试着把“4”改为4。我需要转换的数字范围是1-99。超过9的数字将有一个破折号(例如:25) 我已经尝试了,字符串->数字,但返回false。我不知道还能尝试什么 请帮助。这里有一个有趣的解决方案: (define count (lambda (limit) (let loop ((i 0)) (let ((number (format #f "~r" i))) (if (equal? number

如何将拼写为数字(例如“4”)的字符串转换为整数?总之,我试着把“4”改为4。我需要转换的数字范围是1-99。超过9的数字将有一个破折号(例如:25)

我已经尝试了,字符串->数字,但返回false。我不知道还能尝试什么


请帮助。

这里有一个有趣的解决方案:

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

以下是将数字从字符串形式转换为整数形式的一种方法:

(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 spliting将字符串分成两个不带连字符的部分,例如
(regexp split#rx“-“二十四”)
返回
(“二十四”)
,和
(regexp split#rx“-“一”)
返回
(“一”)
。其思想是使用字典(列表列表)作为源,如果是单个字符串,则查找字符串的值;如果有连字符,则查找两个字符串的值。如果有两个字符串,则会添加它们的值,例如从
“(“二十四”)
,查找“二十”和“四”的值,然后添加它们以返回24(20+4)

我所能想到的就是字符串->数字“四”除了定义99个术语,我想不出另外一种方法。这不是那么简单。这是一个很好的python答案,也许你可以转换成scheme。这是一个关于一般算法的问题。我会尝试一下,但我刚开始使用这种编程语言,对列表不太熟悉。我没有很幸运,但我会继续尝试,如果其他人有想法,请告诉我,谢谢。这看起来更像是一个普通的Lisp
格式,而不是一个方案或球拍
格式
@molbdnilo Oops,你说得对。我没有注意到球拍标签。我应该删除我的答案吗?嘿,谢谢你的帮助,我也想出了一个类似的方法,但是我没有使用列表,而是定义了与你一样的数字集,我也使用了(con将那里的数字设置为等于。然后我将试图转换为数字的字符串转换为符号,并使用equal?进行比较,如果有相同的数字,我将其称为Ito equal。但您的方法肯定要简单得多:)