2011-06-30 45 views
8

Có tương đương gsub cho số nguyên hoặc số thập phân không? Gsub có nên làm việc với các số nguyên không? Về cơ bản tôi chỉ đang cố gắng nhập số thập phân vào một dạng ruby ​​và người dùng có thể sử dụng dấu phẩy. Ví dụ: tôi muốn người dùng có thể nhập 1.000,99.Tước dấu phẩy từ Số nguyên hoặc số thập phân trong đường ray

Tôi đã cố gắng sử dụng

before_save :strip_commas 

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

nhưng nhận được lỗi sau "phương pháp xác định 'gsub' cho 8: Fixnum" ở đâu '8' được thay thế bằng bất kỳ số lượng người dùng nhập vào.

+0

là trường số có phao không? Rails nên chăm sóc chuyển đổi cho bạn để dấu phẩy sẽ không thực sự ở đó trong dữ liệu. – ErsatzRyan

+1

Trường này là số thập phân. Khi tôi nhập một cái gì đó như 2.000 vào lĩnh vực này, tôi nhận được "2" trong cơ sở dữ liệu mysql của tôi. – Oakland510

Trả lời

14

Nếu trường của bạn là Fixnum, nó sẽ không bao giờ có dấu phẩy, vì Rails sẽ phải chuyển đổi đầu vào của người dùng thành một số để lưu trữ nó ở đó.

Tuy nhiên, nó sẽ làm điều đó bằng cách gọi to_i trên chuỗi đầu vào, đó không phải là những gì bạn muốn. trọng setter bình thường để một cái gì đó giống như

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

Không thử nghiệm, nhưng một cái gì đó giống như này nên làm việc ...

Bạn cần phải nhận tại dấu phẩy trong khi đầu vào vẫn là một chuỗi.

Edit: Như đã nêu trong các ý kiến, nếu bạn muốn chấp nhận số thập phân, và tạo ra một cái gì đó không phải là một số nguyên, bạn cần một chuyển đổi khác nhau hơn String.to_i. Ngoài ra, các quốc gia khác nhau có các quy ước khác nhau cho dấu chấm câu, vì vậy đây không phải là giải pháp hoàn chỉnh.

+1

Đã hoạt động hoàn hảo! Tôi chỉ cần thay đổi to_i to_d kể từ đó. Tôi đã mất trí do thiếu dấu phẩy trong một Fixnum. Cảm ơn. – Oakland510

+0

Thật vậy, tôi quên bạn cũng muốn cho phép thập phân và chúng tôi đang đối phó với Fixnum và không Integer ... Nhưng bạn có ý tưởng. Tôi sẽ chỉnh sửa câu trả lời. –

+8

Hãy lưu ý rằng điều này có thể khiến bạn bị trục xuất ở một nơi nào đó, vì người châu Âu sẽ nhập những thứ như 100,00, nghĩa là 100,00, bạn sẽ hiểu là 10000. Tôi nói từ kinh nghiệm. – d11wtq

3

thử self.number.gsub(/\D/, ''). Tức là, xóa mọi thứ không phải là chữ số. Regexen không phân biệt giữa số nguyên, phao, số thập phân, v.v. Và Rails sẽ không chuyển đổi nó một cách chính xác cho bạn, bởi vì nó chỉ gọi #to_i hoặc #to_f trên đó.

EDIT:

thực: self.number.gsub(/[^\d\.]/, '').to_f: tất cả những gì không phải là một chữ số hoặc dấu thập phân, và chuyển nó sang một phao.

+3

Bạn không cần phải thoát khỏi ''.'' bởi vì, khi nó nằm trong một phạm vi'' [.] '', Nó mất tính đặc biệt của nó và tự động là một chữ. Vì vậy, '[^ \ d.]' Là chính xác hơn. Rời khỏi nó thoát là OK mặc dù bởi vì nó hoạt động như một lời nhắc nhở trực quan về hành vi. –

Các vấn đề liên quan