我有一个字符和整数列表,我正在尝试将它们转换为字符串。
> (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"
?
答案 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
是大写A
而66
是大写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"