2017-02-01 31 views
0

如何将可拼出数字的字符串(例如“4”)转换为整数?总之,我试图将“四”改为4.我需要转换的数字范围是从1到99.九以上的数字将有一个破折号(例如:25)。将字符串形式的数字转换为计划中的整数

我试过,string-> number,但是这返回false。我不知道还有什么可以尝试的。

请帮忙。

+0

所有我能想到的是字符串 - >数字“四” – raffi

+0

我想不出另一种方式来做它,然后定义99个术语 – raffi

+0

它不是那么简单,这是一个很好的答案在Python中,也许你可以转换为计划http://stackoverflow.com/a/493788/6328256这里是一个问题,通过一般算法http://stackoverflow.com/questions/70161/how-to-read-values-from数字编写为字 – 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来设置数字等于,然后切换字符串即时通讯尝试转换为一个数字符号和使用平等?比较,如果有相同的我打电话号码伊藤等于。但你的方式肯定是更快,更容易:) – 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

这看起来更像是Common Lisp格式,而不是Scheme或Racket 'format'。 – molbdnilo

+0

@molbdnilo哎呀,你是对的。我没有注意到Racket标签。我应该删除我的答案吗? –