2014-06-05 2 views
0

Je résous ce kata rubis. Essentiellement ce que le code fait est de produire un nombre entier avec cinq chiffres. Exemple:Ruby Kata Entier Conversion dépannage

5 = 00005 
12 = 00012 
12345 = 12345 
000=

Voici mon code:

def solution(value) #00001204 
    string_value = value.to_s 
    if string_value.length <= 5 
    amount_of_zeros = "0" * (string_value.length - 5).abs 
    puts "Value is #{amount_of_zeros}" + "#{string_value}" 
    else 
    start_of_characters = 5 - string_value.length #-3 
    puts "Value is " + string_value[-1..start_of_characters] 
    end 
end 

Tout fonctionne bien jusqu'à ce que je place 00001204. Pour une raison quelconque, je reçois la sortie 00644. J'ai essayé d'utiliser binding.pry pour voir ce qui se passait et mon numéro est converti en 644 depuis le début. Pourquoi fait-il ça? Les docs ne mentionnent rien à ce sujet. Je ne sais pas comment résoudre ce problème car sur la première ligne de ma méthode, il est déjà 644. Des pensées?

Répondre

3

Dans ruby, les nombres 0 préfixés sont interprétés comme octaux. Quand vous passez 00001204 à votre méthode, ruby ​​suppose que vous voulez que le nombre soit interprété comme octal. 1204 = 644 .

644.to_s 8 
=> "1204" 
01204.to_s 10 
=> "644" 

Consultez les littéraux Ruby documentation.

+0

Merci @Zajn. Ruby n'aurait pas une méthode qui change l'octal en décimal, n'est-ce pas? –

+0

Vous pouvez utiliser 'to_s (base)', où base est la base de nombres que vous voulez convertir. Donc '01204.to_s (10)' donnerait '' 644 "'. – Zajn

+0

Dans * plusieurs * langues, les nombres 0-préfixés sont considérés comme octaux. Ce n'est pas limité à Ruby. '0x08 # => 8',' 010 # => 8', '8 # => 8',' 0b00001000 # => 8', qui sont des représentations hexadécimales, octales, décimales et binaires du même nombre '8'. –

0

comme Zajn dit qu'il est dû à ce qu'il soit interprété comme octal. Vous pouvez également utiliser .to_i pour le forcer à être un nombre entier.

>> 000000001204 
=> 644 
>> "000000001204".to_i 
=> 1204 

Jetez aussi un oeil à la chaîne mise en forme avec% si vous voulez juste à la sortie, puisqu'il peut nettoyer votre code beaucoup

>> "%05d" % "000001204".to_i 
=> "01204"