web-dev-qa-db-fra.com

Comment forcer Ruby chaîne à n caractères

Comment forcer Ruby sortie de variable de chaîne en utilisant puts à n caractères de sorte que si la variable est plus longue, elle sera tronquée, si elle est plus courte, elle sera développée en suivant ou en début) les espaces?

Existe-t-il une méthode standard pour ce faire?

39
Paul

Ruby prend en charge l'utilisation de chaînes de format, comme de nombreuses autres langues:

 [11] (levier) principal: 0> '% 3.3s'% 'f' 
 => "F" 
 [12] (levier) main: 0> ' % 3.3s '%' foo '
 => "Foo" 
 [13] (levier) main: 0>'% 3.3s '%' foobar '
 => " foo "

Si vous souhaitez remplir à droite, utilisez un - dans la chaîne de format:

 [14] (levier) principal: 0> '% -3.3s'% 'f' 
 => "F" 
 [15] (levier) principal: 0> '% -3.3s'% 'foo' 
 => "Foo" 
 [16] (pry) main: 0> '% -3.3s'% 'foobar' 
 => "foo" 

Vous pouvez également utiliser printf ou sprintf, mais je préfère le plus générique % , qui est comme sprintf .

À partir des documents sprintf:

 s | L'argument est une chaîne à remplacer. Si le format 
 | séquence contient une précision, au plus autant de caractères 
 | sera copié. 

et:

 - | tout | Justifiez à gauche le résultat de cette conversion. 

Que se passe-t-il si je veux remplir non pas avec des espaces mais avec un autre personnage?

Le code sous-jacent Ruby est écrit en C, et il est codé en dur pour utiliser ' ' comme caractère de pad, donc ce n'est pas possible directement, sauf si vous souhaitez modifier la source, recompiler votre Ruby et vivre avec une version unique de la langue. Au lieu de cela, vous pouvez faire quelque chose comme:

 [17] (levier) main: 0> ('% -3.3s'% 'f'). Gsub ('', '.') 
 => "F .." 

Cela devient cependant beaucoup plus compliqué qu'un simple gsub. Il est souvent préférable d'ajuster la chaîne sans utiliser de chaînes de format si vous devez fournir des caractères spéciaux. Les chaînes de format sont très puissantes mais elles ne sont pas totalement flexibles.

Sinon, j'irais avec quelque chose comme la solution de @ steenslag, qui est la base pour rouler la vôtre. Vous perdez la possibilité d'utiliser des chaînes de format et devez compter sur la concaténation de vos chaînes ou quelque chose de similaire pour obtenir une sortie en colonnes, mais cela fonctionnera également.

52
the Tin Man

Pour rendre une chaîne de longueur fixe plus courte:

  str_var.slice(1..10)

Pour rendre une chaîne de longueur fixe plus longue:

  str_var.ljust(10, ' ')

Ils pourraient être combinés en quelque chose comme:

  (str_var.length > 10) ? str_var.slice(1..10) : str_var.ljust(10, ' ')

str_var est, bien sûr, votre chaîne

34
MiGro
class String
  def fix(size, padstr=' ')
    self[0...size].rjust(size, padstr) #or ljust
  end
end

p 'lettersletters'.fix(9) #=> "lettersle"
p 'letters'.fix(10, '.')  #=> "...letters"

Combine la méthode slice (la []) avec rjust.

8
steenslag

Pour un Ruby un liner pur, vous pouvez faire ceci:

(str + ' ' * length)[0,length]

Ce qui donnera:

str = "Hello"
length = 10
=> "Hello     "

ou:

str = "Hello"
length = 2
=> "He"
3
superluminary

Si vous parlez d'une méthode pour tronquer les chaînes, je vérifierais ActionView :: Helpers :: TextHelper # truncate

À partir des exemples:

truncate("Once upon a time in a world far far away")

# => Once upon a time in a world...
1
Kormie