2011-06-30 19 views
8

Czy istnieje odpowiednik gsub dla liczb całkowitych lub liczb dziesiętnych? Czy gsub powinien działać z liczbami całkowitymi? Zasadniczo próbuję wprowadzić dziesiętny w formie ruby ​​i co użytkownik może używać przecinków. Na przykład chcę, aby użytkownik mógł wprowadzić 1,000.99.Przecinanie przecinków od liczb całkowitych lub liczb dziesiętnych w szynach

Próbowałem za pomocą

before_save :strip_commas 

def strip_commas 
    self.number = self.number.gsub(",", "")  
end 

ale pojawia się następujący błąd „metoda niezdefiniowany` gsub”na 8: Fixnum” gdzie «8» zastępuje się cokolwiek numer użytkownik wprowadzi.

+0

to pole liczbowe zmiennoprzecinkowe? Railsy powinny zająć się konwersją, tak aby w danych nie było przecinka. – ErsatzRyan

+1

Pole jest dziesiętne. Kiedy wprowadzam coś w rodzaju 2000 do pola, otrzymuję "2" w mojej bazie danych mysql. – Oakland510

Odpowiedz

14

Jeśli twoje pole jest Fixnum, to nigdy nie będzie miało przecinków, ponieważ Railsy będą musiały przekonwertować dane wejściowe użytkownika na numer, aby go tam zapisać.

Jednak zrobi to, wywołując to_i w łańcuchu wejściowym, co nie jest tym, czego potrzebujesz. nadrzędnymi normalne setter aby coś jak

def price=(num) 
    num.gsub!(',','') if num.is_a?(String) 
    self[:price] = num.to_i 
end 

nie testowane, ale coś przypominającego to powinno działać ...

Musisz dostać się na przecinkami podczas gdy wejście jest wciąż łańcuch.

Edit: Jak zauważył w komentarzach, jeśli chcesz zaakceptować dziesiętne i stworzyć coś nie liczbą całkowitą, trzeba inną przemianę niż String.to_i. Ponadto różne kraje mają różne konwencje interpunkcji numerycznej, więc nie jest to kompletne rozwiązanie.

+1

Działa doskonale! Po prostu muszę zmienić to_i na to_d od. Byłem szalony z powodu braku przecinków w Fixnum. Dzięki. – Oakland510

+0

Rzeczywiście, zapomniałem, że chciałeś także, aby zezwalać na ułamki dziesiętne i mamy do czynienia z Fixnum, a nie Integerem ... Ale masz pomysł. Będę edytować odpowiedź. –

+8

Pamiętaj, że to może cię złapać gdzieś w dole, ponieważ Europejczycy będą wpisywać rzeczy takie jak 100,00, czyli 100,00, które zinterpretujesz jako 10000. Mówię z doświadczenia. – d11wtq

3

spróbuj self.number.gsub(/\D/, ''). To znaczy, usuń wszystko, co nie jest cyfrą. Regexen nie rozróżnia liczb całkowitych, liczb zmiennoprzecinkowych, liczb dziesiętnych itd. To wszystkie ciągi znaków. I Railsy nie przekonwertują go poprawnie, ponieważ po prostu wywołuje na nim #to_i lub .

EDIT:

rzeczywiście: self.number.gsub(/[^\d\.]/, '').to_f: wszystko, co nie jest cyfrą lub punkt dziesiętny i konwertować je do pływaka.

+3

Nie musisz uciekać przed '' .'', ponieważ, gdy znajduje się w zasięgu ''[.]'', Traci swoją specjalność i jest automatycznie dosłowne. Tak więc "[^ \ d.]" Jest bardziej poprawne. Opuszczenie go jest jednak w porządku, ponieważ działa jak wizualne przypomnienie tego zachowania. –

Powiązane problemy