2010-11-26 23 views
0

J'ai une chaîneComment afficher un nombre long dans les groupes?

string = '1234432198766789' 

Je veux qu'il ressemble à ceci:

"1234 4321 9876 6789" 

Quelle est la meilleure façon de le faire? Je suis capable d'utiliser les extensions String de Rails.

Je ne souhaite pas modifier la chaîne d'origine, donc la méthode insert n'a pas pu être utilisée.

+0

Il doit y avoir beaucoup plus d'informations: les cordes ont-elles toujours la même longueur? Ou, sont-ils toujours même des limites de quatre caractères? Ou, pourraient-ils être des longueurs arbitraires et que vous voulez les casser en autant de morceaux de quatre caractères que possible? Et, si le dernier est ce que vous voulez, où devraient aller les caractères de débordement, au début ou à la fin de la chaîne? –

Répondre

4
p '12345678'.reverse.scan(/.{1,4}/).join(' ').reverse 
# => "1234 5678" 

Pourquoi le double reverse? De sorte que lorsque la longueur de la chaîne n'est pas un multiple de quatre, le groupe alléatoires sera sur la gauche:

p '123456'.reverse.scan(/.{1,4}/).join(' ').reverse 
# => "12 3456" 

Si vous savez que votre chaîne sera toujours un multiple de quatre, ou si vous ne le faites pas attention le groupe de taille impaire étant sur la droite, alors laissez les deux appels à reverse.

p '123456'.scan(/.{1,4}/).join(' ') 
# => "1234 56" 
+0

C'était exactement là où je me dirigeais lorsque j'ai demandé à l'OP des éclaircissements sur le besoin. Vous devez avoir été mordu par des problèmes similaires d'une largeur de champ variant de façon inattendue aussi à un moment donné. :-) –

+0

@Greg, Bien que je ne m'en souvienne pas, je suis sûr que tu as raison. J'ai dû apprendre l'idiome de double-inverse de quelque part. :) –

4

Version longue:

string.split("").in_groups_of(4).map { |s| s.join("") }.join(" ") 

Est-ce censé être un numéro de téléphone d'une sorte? Rails a un number_to_phone helper that you could use.

+0

Où est documenté in_groups_of() '? Je ne le vois pas dans Array. –

+4

La méthode Ruby pure consiste à utiliser 'each_slice (4)'. La méthode 'in_groups_of' fait partie d'ActiveSupport, voir: http://rails.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Array/Grouping.html –

+0

Greg: c'est une extension Rails (Active Support) de la classe Array qui, pour une raison quelconque, n'apparaît pas sur api.rubyonrails.org –

1

Une autre solution:

string.scan(/.{1,4}/).join(' ') 

post-scriptum La solution de Ryan a l'avantage de changer string.split('') avec string.chars.to_a si jamais vous avez à faire des choses i18n. Cela peut être un cauchemar ...