2008-10-23 19 views
7

मैं एक नियमित अभिव्यक्ति के बाद हूं जो 0 100 से प्रतिशत को मान्य करता है और दो दशमलव स्थानों की अनुमति देता है।जावास्क्रिप्ट प्रतिशत सत्यापन

क्या कोई यह जानता है कि यह कैसे करें या अच्छी वेबसाइट के बारे में जानें जिसमें जावास्क्रिप्ट में क्लाइंट साइड सत्यापन के लिए उपयोग किए जाने वाले सामान्य नियमित अभिव्यक्तियों का उदाहरण है?

@ टॉम - प्रश्नों के लिए धन्यवाद। आदर्श रूप से कोई अग्रणी 0 या अन्य पिछला पात्र नहीं होगा।

उन सभी लोगों के लिए धन्यवाद जिन्होंने अभी तक जवाब दिया है। मुझे टिप्पणियां वाकई दिलचस्प मिली हैं।

उत्तर

27

के बजाय इस के लिए नियमित अभिव्यक्ति का उपयोग करते हुए, मैं बस उपयोगकर्ता की दर्ज की गई संख्या एक चल बिन्दु मान के लिए बदल जाएगा, और फिर रेंज आप चाहते हैं के लिए जाँच (0 100 तक)। नियमित अभिव्यक्तियों के साथ संख्यात्मक सीमा सत्यापन करने का प्रयास करना हमेशा नौकरी के लिए गलत उपकरण है।

var x = parseFloat(str); 
if (isNaN(x) || x < 0 || x > 100) { 
    // value is out of range 
} 
+0

मैं इसे पर्याप्त वोट नहीं दे सकता। – eyelidlessness

+0

ऐसा लगता है, सही रेगेक्स लिखना अक्सर एक पहेली को सुलझाने जैसा है - अनावश्यक लेकिन चुनौतीपूर्ण। –

+0

अच्छा, यह जांच नहीं करता कि जब भी x 2 से अधिक दशमलव हो, तो इसे जांचने के लिए छोटा था, var decSeparator = "।"; यदि (("" + x) .indexOf (decSeparator) kentaromiura

0

(100|[0-9]{1,2})(\.[0-9]{1,2})?

कि regex आप चाहते हैं होना चाहिए। मेरा सुझाव है कि आप मास्टरिंग नियमित अभिव्यक्ति को पढ़ने और रीगेक्सबड्डी या रेगेक्स कोच डाउनलोड करें।

+1

100.10 मिलान किया जाएगा और – Czimi

1

यह देखते हुए कि अपने मूल्य str में है

str.match(/^(100(\.0{1,2})?|([0-9]?[0-9](\.[0-9]{1,2})))$/) 
+0

यह मेल नहीं होना चाहिए 05.50% जो कि अजीब तरह का है। अग्रणी और पीछे 0 की अनुमति नहीं दी जानी चाहिए। – billjamesdev

+0

हम्म, ठीक है, हो सकता है कि सिर्फ 0 की अगुवाई की जानी चाहिए। 5.50% 5.5% – billjamesdev

+0

की तुलना में अर्थहीन नहीं है दुर्भाग्य से यह रेगेक्स 5 या 15 से मेल नहीं खाता है। ई। दशमलव स्थानों के बिना संख्याएं। –

9

मेरा प्रस्ताव है इस एक:

(^100(\.0{1,2})?$)|(^([1-9]([0-9])?|0)(\.[0-9]{1,2})?$) 

यह 100, 100.0 और 100.00 इस हिस्से

^100(\.0{1,2})?$ 

और संख्या 0 की तरह, 15, 99, 3.1 का उपयोग कर से मेल खाता है, 21.67

का उपयोग कर
^([1-9]([0-9])?|0)(\.[0-9]{1,2})?$ 

ध्यान दें कि कौन से प्रमुख शून्य प्रतिबंधित हैं ited, लेकिन पीछे शून्य शून्य की अनुमति है (हालांकि दो दशमलव स्थानों से अधिक नहीं)।

+1

अब तक का सबसे सही नियमित एक्सप्रेस में से एक है। – yogihosting

0
^100(\.(0){0,2})?$|^([1-9]?[0-9])(\.(\d{0,2}))?\%$ 

यह मेल खाएगा:
100.00
वैकल्पिक "1-9" एक अंकों (इस पूर्णांक भाग बनाता है) द्वारा पीछा किया, वैकल्पिक रूप से दो अंक


क्या से एक बिंदु के बाद और मैं देखें, ग्रेग हेगिल का उदाहरण वास्तव में अच्छी तरह से काम नहीं करता है क्योंकि parseFloat ('15x') बस 15 लौटाएगा जोx < 100 स्थिति से मेल खाता है। parseFloat का उपयोग करना स्पष्ट रूप से गलत है क्योंकि यह प्रतिशत मान को मान्य नहीं करता है, यह सत्यापन को मजबूर करने का प्रयास करता है। यहां के आसपास के कुछ लोग अग्रणी शून्यों के बारे में शिकायत कर रहे हैं और कुछ पिछली अवैध पात्रों को अनदेखा कर रहे हैं। शायद प्रश्न के लेखक को इसे संपादित करना चाहिए और उसे स्पष्ट करना चाहिए कि उसे क्या चाहिए।

+0

"1.", "95.", "100." जैसे तारों से मेल खाएगा। शायद regex को सही किया जाना चाहिए। –

5

यह मैं an old blog Entry की याद दिलाता है एलेक्स Papadimoulis (The Daily WTF फेम) जहां वह निम्नलिखित कहानी कहता द्वारा:

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

आप इस सवाल का जवाब कैसे देंगे ?

  1. यह निर्भर करता है। तुम drywall की तरह कुछ में एक छोटा सा (£ 20) कील पाउंड करने के लिए देख रहे हैं, तो आप विशेष रूप से अगर जूता गंदा है यह बहुत आसान है बोतल का उपयोग करने के मिल जाएगा। हालांकि, अगर आप कुछ लकड़ी में भारी नाखून चलाने की कोशिश कर रहे हैं, जूता के साथ जाओ: बोतल आपके हाथ में टूटने के साथ।

  2. आपके द्वारा खरीदे जाने वाले तरीके से कुछ मौलिक रूप से गलत है डिंग; आपको वास्तविक उपकरण का उपयोग करने की आवश्यकता है। हां, इसमें टूलबॉक्स (या यहां तक ​​कि हार्डवेयर स्टोर तक) की यात्रा शामिल हो सकती है, लेकिन यह सही तरीके से करने से आपके उत्पाद के जीवन चक्र के माध्यम से बहुत समय, धन और बढ़ोतरी हो रही है। जब तक आप निर्माण की मूल बातें समझ नहीं लेते हैं, तब तक आपको पैसे के लिए चीजें बनाने की जरूरत है।

यह इस तरह के एक सवाल, जहां ज्यादातर लोग समस्या को हल करने के लिए सही नियमित अभिव्यक्ति के साथ आने के लिए एक चुनौती के रूप में यह देखता है, लेकिन यह ज्यादा बेहतर बस नियमित अभिव्यक्ति का उपयोग कर प्रयोग कर रहे हैं कि कहने के लिए किया जाएगा नौकरी के लिए गलत उपकरण।

संख्यात्मक श्रेणियों को सत्यापित करने के लिए रेगेक्स का उपयोग करने का प्रयास करते समय समस्या यह है कि यदि अनुमति सीमा के लिए आवश्यकताएं बदलती हैं तो यह बदलना मुश्किल है। आज आवश्यकता 0 और 100 के बीच की संख्या को सत्यापित करने के लिए हो सकती है और इसके लिए एक रेगेक्स लिखना संभव है जो आपकी आंखें खून नहीं करता है। लेकिन अगले हफ्ते आवश्यकता हो सकती है तो 0 और 315 के बीच मूल्यों की अनुमति है। शुभकामनाएं आपके रेगेक्स को बदलना।

ग्रेग हेगिल द्वारा दिए गए समाधान शायद बेहतर है - भले ही यह "99fxx" को "99" के रूप में मान्य करेगा। लेकिन उन परिस्थितियों को देखते हुए जो वास्तव में ठीक हो सकते हैं।

0

@mlarsen: क्या यह कोई रेगेक्स नौकरी बेहतर नहीं करेगा।

100|(([1-9][0-9])|[0-9])(\.(([0-9][1-9])|[1-9]))? 

एक क्रॉस-भाषा की जांच होगी, सिर्फ उत्पादन मैच लंबाई के साथ इनपुट लंबाई की जाँच से सावधान:

कि मान्यता याद रखें कुछ की तरह ग्राहक पर और सर्वर साइड पर दोनों किया जा msut, इसलिए।

+0

और अब आपके पास एक रेगेक्स है जो इस आवश्यकता से मेल खाता है। एक हफ्ते बाद आवश्यकताएं बदलती हैं इसलिए अब आपके रेगेक्स को 0 और 255 के बीच मानों से मेल खाना चाहिए। शुभकामनाएं आपके रेगेक्स को बदल रही हैं और इसे बाद में पठनीय है। – mlarsen

+0

हां, यह सच है, यहां अच्छा बिंदु है, लेकिन किसी भी मामले में नकारात्मकता है, इसलिए आप केवल यह करना चाहते हैं कि आप क्या करना चाहते हैं ... आप देखते हैं, मैं कॉन्फ़िगरेशन फ़ाइल में regex डालने के लिए उपयोग करता हूं, इसलिए यदि आवश्यकता हो बदलें, मुझे पहले से ही पता है कि सत्यापन कोड को कहां संशोधित करना है। – kentaromiura

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