2008-10-27 5 views
6

में कोई मान दिनांक/संख्या है या नहीं, यह जांचने का सही तरीका क्या है कि यह मूल्य जांचने का सही तरीका है कि कोई मूल्य डेल्फी में दिनांक/संख्या है या नहीं?डेल्फी

मुझे पता है कि अन्य भाषाओं में isDate और isNaN जैसे कार्य हैं, लेकिन डेल्फी समतुल्य क्या है? क्षण में मैं इस

function isNumeric(s1:string):boolean; 
begin 
    // will throw exception if its not a number 
    // there must be a better way to do this!! 
    try 
    StrTofloat(s1); 
     result := TRUE ; 
    except 
     result := FALSE; 
     end; 
end; 

है लेकिन फेंक अपवाद नहीं कर सकते अच्छा हो, और यह कठिन डिबगिंग के रूप में मैं अपवाद संवाद हर बार कोड कहा जाता है दिखाई दे रहा है बनाता है।

उत्तर

14

पूर्णांक के लिए, आप की जाँच करें और फेंक अपवाद के बिना कन्वर्ट करने के लिए इस्तेमाल कर सकते हैं TryStrToInt:

function TryStrToInt(const s: string; out i : integer): boolean; 

मैं पूरी तरह से सुनिश्चित तैरता के लिए एक पूर्ण बराबर होती है, हालांकि, तो आप StrToFloat (उपयोग करने के लिए आवश्यकता हो सकती है नहीं कर रहा हूँ) और एक TFormatException की संभावना को स्वीकार करते हैं।

+1

हां वहाँ TryStrToDate और TryStrToFloat और भी बहुत कुछ है। SysUtils की जांच करें। –

+0

धन्यवाद, गेमकैट। यह कुछ सालों से रहा है;) – Alan

+0

यदि आपको अधिक सहायता चाहिए तो कोडगियर दस्तावेज़ ऑनलाइन उपलब्ध हैं। http://docs.codegear.com/ – stukelly

2

TryStrToFloat, TryStrToDateTime आदि जैसे कार्यों का एक परिवार है जो ऐसा करता है। वैसे, StrToFloat और अन्य अपवाद उठाने से पहले आंतरिक रूप से "कोशिश करें" संस्करणों का उपयोग करते हैं।

2

सबसे पहले StrToFloatDef फ़ंक्शन एक उपयोगी विकल्प है यदि आप बॉक्स में डिलीवर होने के रूप में भाषा में रहना चाहते हैं।

हालांकि आपका सबसे अच्छा विकल्प जेडीआई कोड पुस्तकालयों (http://www.delphi-jedi.org/) को तैनात करना है और वहां से StrIsNumber फ़ंक्शन का उपयोग करना है।

जेईडीआई ओपन सोर्स है, जो बहुत से तरीकों से बेहद उपयोगी है, और वैसे भी बहुत कुछ जरूरी है।

0

आप उन अपमानजनक अपवादों को बंद कर सकते हैं जिन्हें आप "अपवाद को अनदेखा करें" बॉक्स को चेक करके चेक नहीं कर सकते हैं। उस अपवाद वर्ग के लिए भविष्य के अपवादों को तब अनदेखा कर दिया जाएगा। फिर से पूछना शुरू करने के लिए, बस विकल्प | डीबगर विकल्प पर जाएं और जिन लोगों को आप अनदेखा कर रहे हैं उन्हें अनचेक करें।

+0

मुझे लगता है कि यह जाने के लिए असाधारण रूप से खतरनाक तरीका है - आप हमेशा अपने अपवादों के बारे में जानना चाहते हैं जब तक कि कोई भी अच्छा कारण न हो - और रूपांतरण प्रकार एक नहीं है। एकमात्र ऐसा समय मैंने कभी किया है जो एमएस ओपनजीएल डीएलएल के साथ है जो एक अपवाद अपवाद फेंक देता है और आपके पास भी है। – Cruachan

+0

एर, यह स्पष्ट है कि skamradt एकीकृत डीबगर की अपवादों की अधिसूचना के बारे में बात कर रहा था ("विकल्प | डीबगर विकल्प" के संदर्भ को नोट करें)। इसका मतलब यह है कि डीबगर उन्हें फंस नहीं पाएगा, और उन्हें एप्लिकेशन द्वारा ही संभाला जाएगा। – Argalatyr

+0

बिल्कुल।बहुत उपयोगी जब आपके पास एक अपवाद है जिसे एपीआई कॉल द्वारा उत्पन्न किया जा रहा है जिसे आप कोड में सही ढंग से संभालने में सक्षम हैं और इसे कई पुनरावृत्तियों के साथ लूप में बुलाया जा रहा है। डीबगर को अनदेखा करने से यह आपकी एफ 9 कुंजी पहनने से कहीं ज्यादा बेहतर है। – skamradt

2

पकड़ने के अपवाद बहुत धीमे हैं। यदि आप तेजी से उत्तराधिकार में बार-बार इस तरह के फ़ंक्शन का उपयोग करने की योजना बनाते हैं, जैसे कि फ़ाइल आयात के दौरान फ़ील्ड को सत्यापित करते समय, यह आपके स्वयं के फ़ंक्शन को रोल करने के लायक हो सकता है जो किसी कोशिश को छोड़कर/ब्लॉक को छोड़ने से पहले कुछ सरल चरित्र स्तर की जांच करता है। मैंने बड़ी मात्रा में डेटा का विश्लेषण करते समय एक बड़े प्रदर्शन में वृद्धि के साथ पहले कुछ ऐसा किया है जो सही प्रारूप में नहीं था।

 
function IsNumeric(aValue : string): boolean; 
var 
    i : integer; 
begin 
    result := false; 
    for i := 1 to Length(aValue) do 
    if (NOT (aValue[i] in ['0'..'9', '.', '-', '+', 'E', 'e'])) then 
     exit; 
    try 
    StrToFloat(aValue); 
    result := true; 
    except 
    end; 
end; 

स्पष्ट रूप से यह सही नहीं हो सकता है, और इसमें हार्ड-कोड किए गए मानों की सीमा है। पूरी तरह से आपकी जरूरतों पर निर्भर करता है, यह केवल कुछ आसान था जो आंतरिक प्रक्रिया के लिए अच्छा काम करता था।