$1
, $2
, $3
... sont l'héritage de Perl. Ce sont des variables capture group, c'est-à-dire qu'elles capturent les groupes à l'intérieur de l'expression régulière.
Un groupe nommé est indiqué entre parenthèses. Ainsi, le premier groupe de capture correspond à ([^\.])
, qui est un caractère non point, et (\..*)
correspond à un caractère de point \.
et à tous les autres caractères qui le suivent. Notez que le deuxième groupe est optionnel, donc dans la ligne ci-dessous vous avez l'expression ternaire $2 ? $2 : ""
, qui est une façon cryptique d'obtenir soit la valeur de la capture d'une chaîne vide. Le int, dec = $1, $2_or_blank_string
est un parallel assignment. Ruby prend en charge l'affectation de plusieurs variables à la fois, ce n'est pas différent que de faire int = $1.reversed
puis dec = $2
Donc contient maintenant la partie entière (inversée) et dec
la partie décimale du nombre. Nous sommes intéressés par le premier pour l'instant.
Le prochain while
vide remplace une chaîne. La méthode gsub! remplace toutes les occurrences de l'expression régulière pour la valeur de l'argument seconf. Mais il renvoie nil
si aucun changement n'est survenu, ce qui termine le while
.
Les matches d'expression /(,|\.|^)(\d{3})(\d)/
:
(,|\.|^)
une virgule, un point ou le début de la chaîne
(\d{3})
Trois chiffres
(\d)
Un quatrième chiffre
remplace alors pour . Le \n
dans une substitution de chaîne signifie le nième groupe de capture, tout comme les variables $n
. Donc, il fait essentiellement: si j'ai quatre chiffres, il suffit d'ajouter une virgule après le troisième. Répéter jusqu'à ce qu'aucun groupe de quatre chiffres ne soit trouvé
Ensuite, il suffit d'inverser à nouveau la partie entière et d'ajouter la partie décimale.