2012-06-18 11 views
5

यहाँ क्या मैं अपने मॉडल में उपयोग कर रहा हूँ है: अगर मैं हाथ रेल कंसोल में मैं मैं क्या चाहते द्वारा strip_dollar_sign समारोह से लाइन को चलानेरेल में सत्यापन से पहले मैं मूल्य से डॉलर के संकेत कैसे लगा सकता हूं?

before_validation :strip_dollar_sign 

validates :amount_due, 
      :format => { :with => /^\d+??(?:\.\d{0,2})?$/ }, 
      :numericality => {:greater_than => 0} 

private 

def strip_dollar_sign 
    self.amount_due = self.amount_due.to_s.tr!('$,','').to_f 
end 

(यानी $ 400 400.0 के रूप में समाप्त होता है), लेकिन जब मैं अपने ऐप में वास्तविक रूप का उपयोग करता हूं मान हमेशा 0.0 के रूप में समाप्त होता है। कोई भी पकड़ता है कि मैं क्या गलत कर रहा हूँ?

+3

पैसा फ्लोट के रूप में संग्रहीत नहीं किया जाना चाहिए, लेकिन डेटाबेस में दशमलव और रूबी में बिगडिसीमल के रूप में। फ़्लोट्स में गोलाकार त्रुटियां हो सकती हैं जो अप्रत्याशित परिणाम दे सकती हैं। – DGM

उत्तर

14

तीन समस्याओं:

  • रूप his answer में स्टीफन द्वारा बताया, तो आप अपने tr! कॉल में , दूर करने के लिए, हालांकि यह एक $ के प्रतिस्थापन को प्रभावित नहीं करेगा कर सकते हैं।

  • आप tr! का उपयोग कर रहे हैं, और इसका गलत मूल्य गलत तरीके से उपयोग कर रहे हैं। tr! (रूबी के ! विधि प्रकारों के साथ) मूल स्ट्रिंग में कोई बदलाव नहीं किए जाने पर nil लौटाता है। चूंकि nil.to_f0.0 है, इसलिए आप इसे प्राप्त कर रहे हैं (या शायद नहीं, नीचे देखें)। आपको इसके बजाय tr का उपयोग करना चाहिए।

  • रेल स्वचालित रूप से इसके साथ जुड़े डेटाबेस स्तंभ के लिए सही प्रकार पर काम तर्क बदल देता है, तो भी सत्यापन से पहले अपने मूल्य एक नाव के लिए परिवर्तित किया जा रहा है, और "$400".to_f0.0 है, और है कि क्या अपने कॉलबैक देखता है। समाधान के बजाय एक कॉलबैक का उपयोग करने का amount_due= ओवरराइड करने के लिए है:

    def amount_due=(value) 
        value = value.to_s.tr('$', '').to_f 
        write_attribute(:amount_due, value) 
    end 
    
+1

असल में 'tr' कॉल में अल्पविराम ठीक है (यदि संभवतः अनचाहे भी है):' "$ 500" .tr ("$,", '') '। दस्तावेज़ों को उद्धृत करने के लिए: "to_str में वर्णों के साथ str की एक प्रति को to_str में संबंधित वर्णों द्वारा प्रतिस्थापित किया गया है। यदि to_str से__str से छोटा है, तो पत्राचार को बनाए रखने के लिए यह अपने अंतिम चरित्र के साथ गद्देदार है।" –

+0

@MichaelKohl अच्छा बिंदु, यह ध्यान देने के लिए संपादित किया गया है कि यह '$' के प्रतिस्थापन को प्रभावित नहीं करता है, हालांकि यह अभी भी अवांछित हो सकता है क्योंकि अल्पविराम कुछ स्थानीय लोगों में एक डिलीमीटर है (साथ ही ओपी स्टीफन के जवाब में निहित है एक त्रुटि थी)। –

+0

मुझे लगता है कि आप यहां कुछ पर हैं, लेकिन कुछ और अभी भी टूटा हुआ है। अगर मैं कंसोल में जाता हूं और 'राशि_due =" $ 400 "चलाता हूं और फिर 'राशि_due.to_s.tr (' $ ',' ') .to_f' आउटपुट' 400.0' है। लेकिन अगर मैं कोई ऑब्जेक्ट बनाता हूं और '.amount_due' मान को '400 डॉलर' असाइन करने का प्रयास करता हूं, तो मुझे अभी भी' 0.0' मिलता है। – richrad

3

$ के बाद एक कॉमा है ताकि आप $ के बजाय $, हटा रहे हों। यहाँ

+0

अच्छा पकड़ो! लेकिन यह अभी भी 0.0 बाहर थूकता है। – richrad

-2

मैं जावास्क्रिप्ट में ऐसा करने की सलाह देते हैं। रेल फॉर्म हेल्पर्स के साथ कुछ जादू करने लगते हैं जो किसी भी गैर-संख्यात्मक मान को उस क्षेत्र में परिवर्तित कर देंगे जो संख्यात्मक डेटाबेस प्रकार से 0.0 तक समर्थित है। बेवकूफ, मुझे पता है।

+0

ओपी रेल में समाधान मांग रहा है (जैसा कि आप टैग देख सकते हैं) इसलिए जेएस अपने प्रश्न का उत्तर नहीं देता है। –

संबंधित मुद्दे