首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >方案中字符串到十进制数

方案中字符串到十进制数
EN

Stack Overflow用户
提问于 2011-03-06 05:27:14
回答 2查看 2.4K关注 0票数 0

在Scheme中可以创建的最透明和优雅的字符串到小数的过程是什么?

它应该产生正确的结果,其中包括"+42“、"-6”、"-.28“和"496.8128”等。

这是受之前发布的整数问题列表的启发:how to convert a list to num in scheme?

我放弃了我的第一次尝试,因为它变得丑陋得很快,并意识到其他人可能也喜欢玩它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-07 00:37:17

更短,也使结果与小数点不精确,并处理任何+-前缀。regexp只用于假定后面的有效语法。

代码语言:javascript
运行
复制
#lang racket/base
(require racket/match)
(define (str->num s)
  ;; makes it possible to assume a correct format later
  (unless (regexp-match? #rx"^[+-]*[0-9]*([.][0-9]*)?$" s)
    (error 'str->num "bad input ~e" s))
  (define (num l a)
    (match l
      ['() a]
      [(cons #\. l) (+ a (/ (num l 0.0) (expt 10 (length l))))]
      [(cons c l) (num l (+ (* 10 a) (- (char->integer c) 48)))]))
  (define (sign l)
    (match l
      [(cons #\- l) (- (sign l))]
      [(cons #\+ l) (sign l)]
      [_ (num l 0)]))
  (sign (string->list s)))
票数 1
EN

Stack Overflow用户

发布于 2011-03-06 09:37:01

这是第一张照片。不是丑陋,不是美丽,只是比我想要的更长。改天再调。我将很乐意将解决方案传递给某个更好的创造者。

代码语言:javascript
运行
复制
((define (string->number S)
  (define (split L c) 
    (let f ((left '()) (right L))
      (cond ((or (not (list? L)) (empty? right)) (values L #f))
            ((eq? c (car right)) (values (reverse left) (cdr right)))
            (else (f (cons (car right) left) (cdr right))))))
  (define (mkint L) 
    (let f ((sum 0) (L (map (lambda (c) (- (char->integer c) (char->integer #\0))) L)))
      (if (empty? L) sum (f (+ (car L) (* 10 sum)) (cdr L)))))
  (define list->num
    (case-lambda
      ((L) (cond ((empty? L) 0) 
                 ((eq? (car L) #\+) (list->num 1 (cdr L))) 
                 ((eq? (car L) #\-) (list->num -1 (cdr L)))
                 (else (list->num 1 L))))
      ((S L) (let*-values (((num E) (split L #\E)) ((W F) (split num #\.)))
               (cond (E (* (list->num S num) (expt 10 (list->num E))))
                     (F (* S (+ (mkint W) (/ (mkint F) (expt 10 (length F))))))
                     (else (* S (mkint W))))))))
  (list->num (string->list S)))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5206894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档