Virgülle dizeyi tam sayıya dönüştür


95

"1.112" yi 1 yerine 1112 tamsayısına çevirmenin düzgün bir yöntemi var mı?

Bir tane var ama düzgün değil:

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

Yanıtlar:


176

Buna ne dersin?

 "1,112".delete(',').to_i

Cevabınız için teşekkürler. Benimkinden çok daha iyi. Aslında iki yerine bir arama olacağını umuyordum. gibi: "1,112" .to_money. Cevapları gözden geçirdikten sonra, muhtemelen böyle bir yöntem yoktur. Her neyse, çok teşekkürler!
mCY

@michealKohi bana söyleyebilir misin delete (), normal ifadeyi kabul eden gsub'da aynı şeyi yapmaktan çok daha hızlıdır, ben her zaman regex yolunun daha hızlı olduğunu düşünmüşümdür. Benchmark'ı her ikisinde de yürütme süresindeki büyük farkla çalıştırdım.
Abhinay

1
@Abhinay Bench işaretlerinizle ilgili olarak: örneklem büyüklüğü? Dize boyutu?
Michael Kohl

5

Ayrıca, kodunuzun doğru bir şekilde yerelleştirildiğinden veya kullanıcıların "uluslararası" gösterime alıştığından emin olmak isteyebilirsiniz. Örneğin, "1.112" aslında farklı ülkelerde farklı sayılar anlamına gelir. Almanya'da bu sayı bin yerine biraz fazla 1 anlamına geliyor.

İlgili Wikipedia makalesi http://en.wikipedia.org/wiki/Decimal_mark adresindedir . Şu anda kötü yazılmış gibi görünüyor. Örneğin bir Çinli olarak Çin'deki bin ayırıcıyla ilgili bu açıklamanın nereden geldiğinden emin değilim.


4

Biraz daha uygun

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

"1 200 200" ün de düzgün çalışmasını sağlar


8
Daha da iyisi '1,1200.00'.gsub(/[^0-9\.]/,'').to_f.
Hauleth

7
Bekle, neden dönüştürmek isteyeyim "1,1200.00"için "1120000"? Sadece ,(veya yerel ayara bağlı olarak) değiştirmek istemiyor musunuz .? Ayrıca, bu onu bir tam sayıya veya kayan noktaya dönüştürmez, sadece sınırlayıcıları olmayan bir dizeye dönüştürür.
brymck

3
@Bryan: Bir tahminde bulunmak için, bunu bir bankacılık uygulamasında, kullanıcının girdiği bir para birimini dönüştürürken, uygulamanın içindeki yalnızca tam sayılarla başa çıkmak için yapmak isteyebilirsiniz: örneğin, dolar ve senti sente dönüştürmek . Bu yöntem, kayan noktalı sayılarla uğraşırken beklenmedik şekilde ortaya çıkabilecek yuvarlama hatalarını önleyecektir. Bir para biriminin kullanıcıya gösterilmesi gerektiğinde, kuruş tutarı dolar ve sente dönüştürülebilir. (Soruyu soran kişinin sorduğu bu olmasa da)
Teemu Leisti

2
Bu cevap, sorucunun dizeyi bir tam sayıya veya kayan noktaya dönüştürme isteğini bile ele almıyor.
Bay Lance E Sloan

2

Aşağıdakiler, diğer yöntemlerin bazılarında olduğu gibi ondalık basamakları çıkarmasına rağmen, çalışacak başka bir yöntemdir.

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


1

Biri virgülden fazlasını çıkarmak istiyorsa hayranıyım:

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

performans hakkında bilmiyorum ama a'dan daha esnektir gsub, yani:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.