J'ai trois valeurs entières, direTemps de mise en forme (HH: MM: SS) dans un dialecte Smalltalk
h := 3.
m := 19.
s := 8.
je voudrais produire la chaîne '03:19:08'
. Je sais comment transformer un nombre en chaîne, et même le remplir avec un zéro si nécessaire. Donc, en tant que premier passage j'ai écrit ce code absolument horrible:
h < 10 ifTrue: [hs := '0', (h asString)] ifFalse: [hs := h asString].
m < 10 ifTrue: [ms := '0', (m asString)] ifFalse: [ms := m asString].
s < 10 ifTrue: [ss := '0', (s asString)] ifFalse: [ss := s asString].
Transcript show: hs, ':', ms, ':', ss.
Transcript nl.
Maintenant, évidemment, je dois nettoyer ce et me demandais si, entre autres ce que l'approche la plus Smalltalk idiomatiques serait ici. Se pourrait-il quelque chose comme (non Smalltalk juridique évidemment):
aCollectionWithHMS each [c | padWithZero] join ':'
Je trouve une discussion sur les flux avec une méthode d'impression en prenant un argument separatedBy
mais ne serait pas là un moyen plus simple de faire les choses simplement avec des cordes?
Ou peut-être il y a une façon plus élégante de tamponner les trois composants et puis je pourrais juste retourner hs, ':', ms, ':', ss
?
Ou existe-t-il une interface pour le formatage POSIX (ou similaire) commune à tous les Smalltalks? Je sais que GNU Smalltalk peut relier à C mais c'est beaucoup trop pour ce problème simple à mon humble avis.
EDIT
Je suis un peu plus près:
z := {h . m . s} collect: [:c | c < 10 ifTrue: ['0', c asString] ifFalse: [c asString]].
(Transcript show: ((z at: 1), ':', (z at: 2), ':', (z at: 3))) nl.
Mais l'accès direct des éléments de collecte me rend triste. J'ai trouvé un page documenting the joining method asStringWith
mais cette méthode n'est pas supportée, il semble dans GNU Smalltalk.
Ça a l'air bien. Je suis allé avec l'addendum 1, mais j'ai utilisé '{''. h. m. s} fold: "Je n'aurais pas pu continuer sans cette idée. –