如何将字符和整数列表转换为字符串

时间:2016-06-29 02:19:16

标签: racket

我有一个字符和整数列表,我正在尝试将它们转换为字符串。

> (define l (cons #\a (cons #\b (cons 3 null))))

我想将此列表转换为字符串"ab3"

使用list->string不起作用:

> (list->string l)
list->string: contract violation
  expected: (listof char?)
  given: (list #\a #\b 3)

当我尝试与integer->char结合使用时,它会提供此数值:

> (define l (cons #\a (cons #\b (cons (integer->char 3) null))))
> (list->string l)
"ab\u0003"

使用number->string也不起作用:

> (define l (cons #\a (cons #\b (cons (number->string 3) null))))
> (list->string l)
list->string: contract violation
  expected: (listof char?)
  given: '(#\a #\b "3")
  context...:
   C:\Program Files\Racket\collects\racket\private\misc.rkt:87:7

list->string需要一个字符列表,它不接受字符串。

另一次尝试,首先将字符串转换为列表:

> (define l (cons #\a (cons #\b (cons (string->list (number->string 123)) null))))
> (list->string l)
list->string: contract violation
  expected: (listof char?)
  given: '(#\a #\b (#\3))
  context...:
   C:\Program Files\Racket\collects\racket\private\misc.rkt:87:7

它也不接受子列表。如何将其转换为字符串"ab3"

2 个答案:

答案 0 :(得分:2)

您希望处理字符和整数列表,并将它们全部连接在一个字符串中。试试这个:

(define (process lst)
  (apply string-append                   ; append all the strings
         (map (lambda (e)                ; create a list of strings
                (if (char? e)            ; if it's a char
                    (string e)           ; convert it to string
                    (number->string e))) ; same if it's a number
              lst)))

例如:

(process (list #\a #\b 123 #\c))
=> "ab123c"

答案 1 :(得分:0)

char是具有值的类型。此值在unicode中定义,因此65是大写A66是大写B。所有字符都有一个整数值,char->integer从字符转换为数字unicode值,integer->char从unicode值转换为字符。

数字字符从48#x30)开始,这是57#x39)的零,即9。因此(list->string (list #\a #\b (integer->number #x33))) ; ==> "ab3"

数值可以转换为number->string的字符串。例如。 (number->string 123) => "123"。这显示在基数10中,但如果您希望它以十六进制显示,则可以(number->string 123 16) ;==> "7b"。请注意,list->string仅列出字符列表,并且不能包含其他元素,如数字。

您可以与string-append一起加入多个字符串:

(string-append (list->string '(#\a #\b))
               (number->string #x7b)
               "c") 
; ==> "ab123c"