Konwertuj ciąg z przecinkiem na liczbę całkowitą

95

Czy istnieje zgrabna metoda zamiany liczby „1112” na liczbę całkowitą 1112 zamiast 1?

Mam jeden, ale nie schludny:

"1,112".split(',').join.to_i #=> 1112
mCY
źródło

Odpowiedzi:

175

Co powiesz na to?

 "1,112".delete(',').to_i
Michael Kohl
źródło
Dziękuję za odpowiedź. Jest o wiele lepszy niż mój. W rzeczywistości miałem nadzieję, że będzie jeden telefon zamiast dwóch. na przykład: „1,112” .to_money. Po przejrzeniu odpowiedzi prawdopodobnie nie ma takiej metody. W każdym razie wielkie dzięki!
mCY,
@michealKohi, czy możesz mi powiedzieć, dlaczego usuwanie () jest znacznie szybsze niż robienie tego samego w gsub, który akceptuje wyrażenia regularne, zawsze myślałem, że sposób regex jest szybszy. Przeprowadziłem Benchmark w obu przypadkach, biorąc pod uwagę ogromną różnicę w czasie wykonania.
Abhinay,
1
@Abhinay Odnośnie Twoich punktów odniesienia: wielkość próbki? Rozmiar sznurka?
Michael Kohl
5

Możesz także chcieć upewnić się, że kod jest poprawnie zlokalizowany lub upewnić się, że użytkownicy są przyzwyczajeni do notacji „międzynarodowej”. Na przykład „1112” oznacza w rzeczywistości różne liczby w różnych krajach. W Niemczech oznacza to liczbę nieco powyżej jednego zamiast tysiąca i coś więcej.

Odpowiedni artykuł Wikipedii znajduje się pod adresem http://en.wikipedia.org/wiki/Decimal_mark . Wydaje się jednak, że w tej chwili jest źle napisany. Np. Jako Chińczyk nie jestem pewien, skąd się bierze opis o separatorze tysiąca w Chinach.

Yì Yáng
źródło
4

Niektóre wygodniejsze

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

sprawia, że ​​"1 200 200" również działa poprawnie

Alexey Novikov
źródło
8
Nawet lepiej '1,1200.00'.gsub(/[^0-9\.]/,'').to_f.
Hauleth
7
Czekaj, dlaczego chcesz przekonwertować "1,1200.00"na "1120000"? Czy nie chcesz po prostu zamienić ,(lub, w zależności od lokalizacji, .)? Ponadto nie konwertuje to na liczbę całkowitą lub zmiennoprzecinkową, tylko ciąg bez ograniczników.
brymck
3
@Bryan: Aby zaryzykować zgadywanie, możesz to zrobić w aplikacji bankowej, podczas przeliczania kwoty waluty wprowadzonej przez użytkownika, aby radzić sobie tylko z liczbami całkowitymi w aplikacji: na przykład, przeliczając dolary i centy na centy . Ta metoda pozwoli uniknąć błędów zaokrągleń, które mogą pojawić się nieoczekiwanie podczas obsługi liczb zmiennoprzecinkowych. Gdy użytkownik musi wyświetlić kwotę waluty, kwotę w centach można przeliczyć na dolary i centy. (Chociaż nie o to pytał pytający.)
Teemu Leisti
2
Ta odpowiedź nie odnosi się nawet do żądania osoby pytającej o konwersję ciągu na liczbę całkowitą lub zmiennoprzecinkową.
LS
2

Poniżej znajduje się kolejna metoda, która będzie działać, chociaż podobnie jak w przypadku niektórych innych metod usuwa miejsca dziesiętne.

a = 1,112
b = a.scan(/\d+/).join().to_i => 1112
Mahesh
źródło
1

Zrobiłbym używając String#tr:

"1,112".tr(',','').to_i # => 1112
Arup Rakshit
źródło
1

Jeśli ktoś szuka więcej niż przecinka, jestem fanem:

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

nie wiem o wydajności, ale jest bardziej elastyczny niż a gsub, tj .:

"1-200".chars.grep(/\d/).join.to_i
davidpm4
źródło
0
String count = count.replace(",", "");
Ajay Rathore
źródło