2013-07-15 3 views
9

사용자 번호 입력을 11,5에서 11.5로 변환하려면 어떻게해야합니까?쉼표를 구분 기호로 변환합니다.

before_validation :comma_to_delimiter 

def comma_to_delimiter 
    self.price.to_s.gsub(',', '.').to_f 
end 

는 그러나이 작동하지 않습니다

나는 콜백으로 다음과 같은 노력했다. 나는 사용자가 구분 기호로 원하는 것을 입력 할 수 있기를 원합니다. 현재 사용자가 점 대신 쉼표를 사용하면 응용 프로그램에서 오류가 발생합니다.

+0

self.price 값의 유형을 설명 할 수 있습니까? – Slicedpan

+0

레일 앱에 표시하기 위해이를 변경하고 싶습니까? –

+0

아니요, 표시 방법에 신경 쓰지 않습니다. 나는 로케일을 통해 그것을 가져 갔다. Price는 구분 기호로 점을 갖는 부동 소수점으로 저장되어야하는 부동 소수점 값입니다. 독일에서는 사람들이 점 대신 구분 기호로 쉼표를 사용합니다. 따라서 독일인이 "5,5"로 타이핑하더라도 "5.5"로 저장해야합니다. 누군가가 "5.5"와 같이 올바르게 입력하면 아무 것도 변경되지 않습니다. 어떤 생각을 어떻게 할 것인가? – weltschmerz

답변

9

여러분이하고있는 일이 최선의 방법이 아닐 수도 있습니다. 아마도 누군가가 더 나은 접근 방식으로 대답 할 수 있습니다. 하지만 라인을 작동 시키려면 실제로 변경 사항을 유지해야합니다.

self.price.to_s.gsub(',', '.').to_f 

변경 사항을 반환 하겠지만 콜백에서는 아무 것도 표시되지 않습니다.

self.price = self.price.to_s.gsub(',', '.').to_f 
# OR 
self.price.to_s.gsub!(',', '.').to_f 

개체 내에서 변경 사항이 유지됩니다.

+0

두 번째 버전에서는 self.price의 값이 변경되지 않습니다 – Slicedpan

+0

코드를 로컬에서 실행했으며 가장 확실하게 시도 했습니까? 테스트되었고 정확하게 레일즈 3에 설명 된대로 작동합니다. – Matt

+0

예. self.price가 이미 문자열 인 경우 변경되었습니다. 나는 그것이 부동 소수점 숫자라는 가정하에 가고 있었다. (질문을 오해했을 수도있다!) – Slicedpan

11

일부 국가에서는 쉼표가 표준 통화 구분 기호이며 사용자가 양식에 "19,99"를 입력하면 구분 기호 변환을 수동으로 처리하지 않는 한 양식이 "19.00"으로 저장됩니다. 이 문제를 해결하는 올바른 방법은 사용자 지정 특성 setter를 작성하는 것입니다.

class Product < ActiveRecord::Base 
    def price=(val) 
    val.sub!(',', '.') if val.is_a?(String) 
    self['price'] = val 
    end 
end 
+2

모든 float 속성에 대해 전역으로 처리하는 것이 좋을까요? – Vassilis

관련 문제