如何在球拍中为Web应用程序将数字转换为字符串

问题描述 投票:2回答:1

我创建了一个简单的Web应用程序,用户在其中输入数字,然后将其计算为不同的货币。我发现的问题是,要显示该数字,首先需要将其转换为字符串。通常,如果它不是Web应用程序,则只执行number->string x,但在这种情况下,它不希望工作,或者至少我做错了。

我的代码:

#lang racket

(require web-server/servlet
         web-server/servlet-env)

(define (page request)
  ;; extract the key value if present
  (define bindings (request-bindings request))

  ;; print entered currency when available
  (cond ((exists-binding? `amount bindings)
         (define (mynumber) (extract-binding/single `amount bindings))
         (define usd (lambda (mynumber) (* mynumber #i1.25)))
         (define eur (lambda (mynumber) (* mynumber #i1.14)))
         (response/xexpr
          '(html (head (title "Currency Exchange"))
                 (body
                  (h1 "Currency Exchange")
                  (div ((class "amount"))
                       (p "entered amount" ,mynumber)
                       (p "amount in USD: " ,usd)
                       (p "amount in EUR: " ,eur))
                  ))))

        ;; If there is no currency entered
        (else
         (response/xexpr
          '(html (head (title "Currency Exchange"))
                 (body
                  (h1 "Currency Exchange")
                  (p "enter currency in GBP:")

                  (form
                   (input ((name "amount")))
                   (input [(type "submit") (value "Calculate")]))
                  ))))
        )
  )

(serve/servlet page
               #:port 8080
               #:listen-ip #f
               #:servlet-path "/currency")

scheme racket
1个回答
2
投票

没有完全回答您的问题,但是我看到了一些错误:

1。

(define (mynumber) (extract-binding/single `amount bindings))

应该是:

(define mynumber (extract-binding/single 'amount bindings))
;; OR
;; (define mynumber (string->number (extract-binding/single 'amount bindings)))

在这种情况下,创建过程没有用。一个简单的定义就可以了。

当您不使用unquote时,请使用引号代替准引号。

2。

(define usd (lambda (mynumber) (* mynumber #i1.25)))
(define eur (lambda (mynumber) (* mynumber #i1.14)))

应该是:

(define usd (* mynumber 1.25))
(define eur (* mynumber 1.14))

同样,无需创建过程,因为您要做的就是将两个数字相乘。

#i(不精确数字)前缀是多余的,因为默认情况下,没有精确性说明符的实数通常不精确(details here)。

3。

(response/xexpr
          '(html (head (title "Currency Exchange"))
                 (body
                  (h1 "Currency Exchange")
                  (div ((class "amount"))
                       (p "entered amount" ,mynumber)
                       (p "amount in USD: " ,usd)
                       (p "amount in EUR: " ,eur)))))

您可以使用quasiquote(即` [反引号])而不是quote(即')来解决此问题,因为您正在使用unquote(即,)。

使用unquote时使用准引用代替引用。

© www.soinside.com 2019 - 2024. All rights reserved.