2010-05-04 12 views
5

मैं एक regex का उपयोग कर एक डॉलर की राशि को मान्य करने के कोशिश कर रहा हूँ: ^[0-9]+\.[0-9]{2}$चल बिन्दु परिशुद्धता

यह ठीक काम करता है, लेकिन जब भी कोई उपयोगकर्ता प्रपत्र सबमिट और डॉलर की राशि 0 में समाप्त होता है (शून्य), रूबी (या रेल?) 0 बंद चॉप। तो 500.00 500.0 में बदल जाता है इस प्रकार रेगेक्स सत्यापन में असफल रहा।

क्या शून्य के पीछे की ओर ध्यान दिए बिना रूबी/रेल उपयोगकर्ता द्वारा दर्ज प्रारूप को रखने का कोई तरीका है?

+1

किसी भी कारण से आप regex के बजाय 'validates_numericality_of' का उपयोग नहीं करते हैं? –

+0

500.001 विफल होने में यह सुनिश्चित करने के लिए मैं 'validates_numericality_of' का उपयोग कैसे करूं? मैं केवल विशेष रूप से स्वरूपित करना चाहता हूं, '[9 अंकों के माध्यम से 0 की संख्या]। [2 से 9 अंकों के 2]' - इस प्रकार 'validates_format_of: राशि, = =/^ [0-9] + \ के साथ।[0-9] {2} $ /,: संदेश => "एक अवधि से अलग" डॉलर और सेंट होना चाहिए "' –

उत्तर

8

मुझे लगता है कि आपकी डॉलर राशि दशमलव प्रकार का है। इसलिए, किसी भी मूल्य उपयोगकर्ता को फ़ील्ड में प्रवेश करने से पहले डेटाबेस में सहेजने से पहले स्ट्रिंग से उचित प्रकार में डाला जा रहा है। प्रमाणीकरण पहले से ही संख्यात्मक प्रकारों में परिवर्तित मानों पर लागू होता है, इसलिए रीगेक्स वास्तव में आपके मामले में एक उपयुक्त सत्यापन फ़िल्टर नहीं है।

  1. उपयोग validates_numericality_of:

    आप इस को हल करने के संभावनाओं की जोड़ी है, हालांकि है। इस तरह आप रूपांतरण को रेल में पूरी तरह से छोड़ देते हैं, और सिर्फ यह जांचें कि राशि किसी दिए गए सीमा के भीतर है या नहीं।

  2. validate_each विधि का उपयोग करें और अपने सत्यापन तर्क को स्वयं कोड करें (उदा। जांच करें कि मान में 2 दशमलव से अधिक अंक हैं)।
  3. मान्य attribute before it's been typecasted:

यह सत्यापन स्थितियों में, जहां उपयोगकर्ता एक पूर्णांक क्षेत्र के लिए एक स्ट्रिंग की आपूर्ति हो सकता है में विशेष रूप से उपयोगी है और आप मूल स्ट्रिंग एक त्रुटि में वापस प्रदर्शित करना चाहते हैं संदेश। विशेषता तक पहुंचने से सामान्य रूप से स्ट्रिंग को 0 पर टाइप किया जाएगा, जो आप नहीं चाहते हैं।

तो, आपके मामले में, आप का उपयोग करने के लिए सक्षम होना चाहिए:

validates_format_of :amount_before_type_cast, :with => /^[0-9]+\.[0-9]{2}$/, :message => "must contain dollars and cents, seperated by a period" 

हालांकि, ध्यान दें उपयोगकर्ताओं के लिए यह अपने कठोर प्रवेश नियमों का पालन करने थकाऊ दिखाई दे सकता है (मैं वास्तव में करने में सक्षम होने पसंद करेंगे उदाहरण के लिए 500500.00 टाइप करें), और कुछ स्थानीय अवधि में दशमलव विभाजक नहीं है (यदि आपने कभी भी अपने ऐप को अंतर्राष्ट्रीयकृत करने की योजना बनाई है)।

+0

... ': राशि_before_type_cast' ... अभी भी डीबी में "500.0" सम्मिलन में परिणाम होगा? पासिंग सत्यापन एक बात है, लेकिन प्रबंधक अभी भी भुगतान रिकॉर्ड खींच सकते हैं और उपयोगकर्ताओं को सही इनपुट के बावजूद वे "500.0" पढ़ेंगे? Arkku के जवाब देखें, कठोरता/कठोरता अनुरोध से है। –

+0

आप (और विशेष रूप से प्रबंधकों) को इस बात से चिंतित नहीं होना चाहिए कि डेटाबेस में मूल्य कैसे संग्रहीत किया जाता है। यह एक संख्या है, इसे एक संख्या के रूप में संग्रहीत किया जाना चाहिए (हालांकि, विभिन्न डेटाबेस में कई संख्या प्रारूप हैं)। Decimals की संख्या केवल तभी निर्दिष्ट किया जाना चाहिए जब आउटपुट स्वरूपण हो, यानी आपके डेटाबेस दृश्य में। –

+1

ओह, और, कृपया, कभी भी _ever_ उस डीबी कॉलम प्रकार को स्ट्रिंग में बदलने पर विचार न करें। –

2

सामान्य रूप से यदि आप एक फ़्लोटिंग पॉइंट मान की दशमलव परिशुद्धता को "याद रखें" चाहते हैं, तो आपको दशमलव प्रकार का उपयोग करना चाहिए, न कि बाइनरी फ्लोट।

दूसरी तरफ, मुझे यकीन नहीं है कि आप स्ट्रिंग प्रस्तुति को इतनी सख्त तरीके से क्यों मजबूर करना चाहते हैं ... किसी भी संख्या को स्वीकार करने और इसे फ़ॉर्मेट करने के बारे में कैसे करें number_to_currency?

+0

इस ऐप के लिए लेखांकन विभाग के सीएफओ द्वारा कठोरता का अनुरोध किया गया था। वह वास्तव में लोगों को इस प्रारूप में बिल्कुल फॉर्म में टाइप करना चाहता है। '@payment.amount = number_to_currency (@ payment.amount,: unit => '' ') '@ payment.save' (नियंत्रक के माध्यम से) से पहले एक ही परिणाम उत्पन्न कर रहा है ... क्या मैं इसे गलत कर रहा हूं? –

+0

मुझे डर है कि आप हैं ... number_to_currency प्रस्तुति उद्देश्यों के लिए है, यानी दृश्य में मात्रा को आउटपुट करते समय उपयोग करने के लिए। बीटीडब्लू, यदि नियम इतने कठोर हैं तो आप कुछ क्लाइंट-साइड सत्यापन करने पर विचार कर सकते हैं, मुझे यकीन है कि इसके लिए बहुत सारे jQuery और प्रोटोटाइप आधारित समाधान हैं। –

0

आम तौर पर पैसे के साथ इसे सेंट में एक पूर्णांक के रूप में स्टोर करना सर्वोत्तम होता है (500 सेंट $ 5.00 है)। मैं इसे संभालने के लिए Money gem का उपयोग करता हूं।

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