2016-06-29 3 views
1

У меня есть список символов и целых чисел, и я пытаюсь преобразовать их в строку.как преобразовать список символов и ints в строку

> (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 требует, чтобы al ist символов, он не принимает строки.

Еще попробуйте сначала преобразовать строку в списке:

> (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

Ваш реальный вопрос, кажется, как преобразовать целое число, как '3' к полукокса как' # \ 3'. 'integer-> char' для этого не является подходящей функцией, поскольку он принимает третий символ ASCII. То, что вы хотите, это нечто вроде 'number-> string', правильно? Всегда ли ваши целые числа в пределах [0,9]? –

+0

Извините, я не знал об этом, я хочу, чтобы число было строковым, а не номером в ascii char code, а число могло быть больше 10. – fluter

+0

Одна вещь, которую вы можете сделать, - это преобразовать все символы в строки, а затем используйте 'string-append' вместо' list-> string'. –

ответ

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" 
+0

Строка 'list-> уже делает то, что делает' apply string', но это не проблема OP. Проблема состоит в том, что 'integer-> char' не выполняет ожидаемого. –

+0

@AlexKnauth ok, я считаю, что сейчас это правильно –

+0

В комментариях @fluter сказал, что число может быть больше 10, и в этом случае он не будет символом вообще. 'number-> string' действительно то, что нужно, а не функция' num-> char'. Конечно, это не «как преобразовать список символов в строку», а преобразовать список символов и строк в строку. –

0

полукокса представляет собой тип, который имеет значение. Это значение определено в unicode, так что 65 является верхним регистром A, а 66 - это верхний регистр B. Все символы имеют целочисленное значение, а char->integer преобразует символы в числовое значение unicode и integer->char конвертирует из значения unicode символ.

Числовые символы начинаются в 48 (#x30), который является от нуля до 57 (#x39), который является девять. Таким образом (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" 
+0

Что такое '# x7b'? Я знаю, что это hex, но почему это вместо '123'? –

+0

@AlexKnauth Это не первый «7b», который они видят, поэтому я просто использую 123 в обеих базах. – Sylwester

Смежные вопросы