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

Odpowiedzi:


175

Co powiesz na to?

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

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.


4

Niektóre wygodniejsze

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

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


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


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.