2016-04-11 66 views
2

onun haneye n parçaları halinde gruplanır öyle ki (n varsayılan değeri 3 olan), her bir Grup I number dönüştürme için, bir ASCII değerini temsil eder number bir dizi göz önüne alındığında değerleri Bu ascii karakterlerin bir dizesi. Örneğin:kendi ASCII bir dizeye bir tamsayı dönüştürme

orada sayısında önemli 0, yani ilk ASCII değeri mutlaka n basamağı temsil olmayacak
n    number  Output 
================================== 
3     70   F 
3   65066066065  ABBA 
4  65006600660065  ABBA 

not edin.

Benim geçerli kod şöyle görünür:

def number_to_string(number, n=3): 
    number = str(number) 
    segment = [] 

    while number: 
     segment.append(number[:n]) 
     number = number[n:] 

    return str(''.join('{:0>{}}'.format(chr(segment), n) for segment in number)) 

Beklenen çıktılar:

number_to_string(70) 
'F' 

number_to_string(65066066065) 
'ABBA' 

number_to_string(65006600660065, n=4) 
'ABBA' 

Benim şu anki kod ancak boş bir dize döndürür. Örneğin, 'F' yerine ' ' döndürür. Bunun nedeni nedir? Teşekkür ederim!


P.S. .: I yani this question işlemini ters dize her karakterin (sayı) ASCII değerlerine dayanan bir dizeye bir tamsayıyı açmak isteyen ediyorum
. Ama bu soruyu okumak, buna cevap vermek için bir zorunluluk değildir.

+0

bir kendi kendine yeten bir soru sorarsanız bizler için daha kolay olur. Bunu anlamak için başka bir soru/cevap/yorum seti okumamıza gerek yok. – tom10

+0

Özür dilerim. :( –

+0

Döngü koşulu'nuz 'sayı ise:' .Bu sayı 'sayı' içinde bir şey kaldığında döngü devam edecek ve 'sayı' boş olduğunda duracaktır demektir. deyim, 'sayı' boştur, 'biçimlendirme' çağrısı için hiçbir şey bırakmaz, böylece boş bir dize döndürülür. ('num' segmenti için 'bir yazım hatası' olduğunu ve aslında 'segment için' olması gerektiğini varsayalım sayı olarak.) –

cevap

1

bu deneyin: Bu eşit karakterlerin her birinin eşit sayıda bölünebilir, böylece sıfır gerekli sayıda ile

import re 

def number_to_string(num, n=3): 
    num_str = str(num) 
    if len(num_str) < n: 
     num_str = '0' * (n-len(num_str)) + num_str 
    elif len(num_str) % n != 0: 
     num_str = '0'*(n-len(num_str)%n) + num_str 
    print(num_str) 

    chars = re.findall('.'*n, num_str) 
    l = [chr(int(i)) for i in chars] 
    return ''.join(l) 

İlk ped (dizeye dönüştürülür) verilen sayı. Daha sonra re kullanarak dizeyi n boyutundaki bölümlere ayırın. Son olarak, chr kullanarak her bir parçayı karaktere dönüştürün ve ardından join kullanarak birleştirin.

+0

Bu soruya cevap vermiyor; OP, varolan kodunun neden çalışmadığını öğrenmek istedi. –

+0

70 girdisi için çalışır, ancak diğer girdiler için garip bir kombinasyon döndürür.Örneğin, '65066066065' için '' \ x06Ǻɞɞ '' döndürür. –

+0

@IndifferentPotato Düzenlenmiş kodu deneyin. Küçük bir hata yaptım. –

0
def numToStr(inp): 
"""Take a number and make a sequence of bytes in a string""" 
out="" 
while inp!=0: 
    out=chr(inp & 255)+out 
    inp=inp>>8 
print "num2string:", out 
return out 

Bu nasıl bir iş çıkar?

+0

Bu, ilk örnek giriş için çalışıyor, ancak diğer için komik bir çıktı döndürüyor. Örneğin, 65066066065 için '\ x91' –

-1

Sadece bu Baskı 'p' harfi gibi \ x numarayı ekleyebilirsiniz:

print '\x70' 
0

istediğin bu var mı?

def num_to_string(num, leng): 
    string = "" 
    for i in range(0,len(str(num)),leng): 
     n = str(num)[i:i+2] 
     string += chr(int(n)) 
    print string 

Çıktı:

>>> ================================ RESTART ================================ 
>>> 
>>> num_to_string(650065006600,4) 
AAB 
>>> num_to_string(650650660,3) 
AAB 
>>> num_to_string(656566,2) 
AAB 
>>> 
+0

döndürür. Bu girdi 660066için kodunuz başarısız olur. Spesifik olmak gerekirse, 3 basamaklı ascii kodları için başarısız olacaktır. –

+0

@ Sнаđошƒаӽ Ascii kodları için rakamlar tek bir dizgede harfler için mi sabitlenmiş? – Abraham