Convertir la chaîne avec virgule en entier

95

Existe-t-il une méthode intéressante pour convertir "1,112" en entier 1112, au lieu de 1?

J'en ai un, mais pas bien:

"1,112".split(',').join.to_i #=> 1112
mCY
la source

Réponses:

175

Que dis-tu de ça?

 "1,112".delete(',').to_i
Michael Kohl
la source
Merci pour votre réponse. C'est bien mieux que le mien. En fait, j'espérais qu'il y aurait un appel au lieu de deux. comme: "1,112" .to_money. Après avoir examiné les réponses, il n'y a probablement pas de telle méthode. Bref, merci beaucoup!
mCY
@michealKohi pouvez-vous me dire pourquoi delete () est beaucoup plus rapide que de faire la même chose dans gsub qui accepte les regex, j'ai toujours pensé que les regex étaient plus rapides. J'ai exécuté Benchmark sur les deux en raison d'une énorme différence de temps d'exécution.
Abhinay
1
@Abhinay Concernant vos benchmarks: taille de l'échantillon? Taille de la chaîne?
Michael Kohl le
5

Vous pouvez également vous assurer que votre code se localise correctement ou vous assurer que les utilisateurs sont habitués à la notation «internationale». Par exemple, «1 112» signifie en fait des nombres différents selon les pays. En Allemagne, cela signifie le nombre un peu plus d'un, au lieu de mille et quelque chose.

L'article Wikipédia correspondant est disponible à l' adresse http://en.wikipedia.org/wiki/Decimal_mark . Il semble cependant mal rédigé pour le moment. Par exemple, en tant que Chinois, je ne sais pas d'où vient cette description d'environ mille séparateurs en Chine.

Yì Yáng
la source
4

Certains plus pratiques

"1,1200.00".gsub(/[^0-9]/,'') 

il fait fonctionner correctement "1 200 200" aussi

Alexey Novikov
la source
8
C'est encore mieux '1,1200.00'.gsub(/[^0-9\.]/,'').to_f.
Hauleth
7
Attendez, pourquoi voudriez - vous convertir "1,1200.00"à "1120000"? Ne voulez-vous pas simplement remplacer le ,(ou, selon les paramètres régionaux, le .)? De plus, cela ne le convertit pas en entier ou en flottant, juste une chaîne sans délimiteurs.
brymck
3
@Bryan: Pour tenter une hypothèse, vous voudrez peut-être le faire dans une application bancaire, lors de la conversion d'un montant en devise que l'utilisateur a saisi, afin de ne traiter que des entiers dans l'application: par exemple, convertir des dollars et des cents en cents . Cette méthode évitera les erreurs d'arrondi qui pourraient surgir de manière inattendue lors du traitement de nombres à virgule flottante. Lorsqu'un montant en devise doit être montré à l'utilisateur, le montant en cent peut être converti en dollars et en cents. (Bien que ce ne soit pas ce que l'interrogateur a demandé.)
Teemu Leisti
2
Cette réponse ne répond même pas à la demande du demandeur de convertir la chaîne en entier ou en flottant.
LS
2

Ce qui suit est une autre méthode qui fonctionnera, bien que comme avec certaines des autres méthodes, elle supprime les décimales.

a = 1,112
b = a.scan(/\d+/).join().to_i => 1112
Mahesh
la source
1

Je ferais en utilisant String#tr:

"1,112".tr(',','').to_i # => 1112
Arup Rakshit
la source
1

Si quelqu'un cherche à faire plus qu'une virgule, je suis fan de:

"1,200".chars.grep(/\d/).join.to_i

je ne sais pas sur les performances mais, c'est plus flexible qu'un gsub, c'est à dire:

"1-200".chars.grep(/\d/).join.to_i
davidpm4
la source
0
String count = count.replace(",", "");
Ajay Rathore
la source