और जावा की दृष्टि से, सिर्फ इशारा करते हुए यह इस तरह के एक समान विधि कमी है कि, के बावजूद हम जैसी चीजों के माध्यम से यह मिल सकता है:
boolean isInteger = Pattern.matches("^\d*$", myString);
अगर Integer.parseInt(myString)
भविष्यवाणी करने के लिए एक अपवाद फेंक देगा और करने के लिए और अधिक काम है। स्ट्रिंग -
से शुरू हो सकती है। इसके अलावा एक int में 10 से अधिक महत्वपूर्ण अंक नहीं हो सकते हैं। तो एक और विश्वसनीय अभिव्यक्ति ^-?0*\d{1,10}$
होगी। लेकिन यह अभिव्यक्ति भी हर अपवाद की भविष्यवाणी नहीं करेगी क्योंकि यह अभी भी बहुत ही कमजोर है।
एक विश्वसनीय नियमित अभिव्यक्ति उत्पन्न करने के लिए संभव है। लेकिन यह बहुत लंबा होगा। एक विधि को कार्यान्वित करना भी संभव है जो निश्चित रूप से निर्धारित करता है कि क्या parseInt अपवाद फेंक देगा। यह ऐसा दिखाई दे सकता:
static boolean wouldParseIntThrowException(String s) {
if (s == null || s.length() == 0) {
return true;
}
char[] max = Integer.toString(Integer.MAX_VALUE).toCharArray();
int i = 0, j = 0, len = s.length();
boolean maybeOutOfBounds = true;
if (s.charAt(0) == '-') {
if (len == 1) {
return true; // s == "-"
}
i = 1;
max[max.length - 1]++; // 2147483647 -> 2147483648
}
while (i < len && s.charAt(i) == '0') {
i++;
}
if (max.length < len - i) {
return true; // too long/out of bounds
} else if (len - i < max.length) {
maybeOutOfBounds = false;
}
while (i < len) {
char digit = s.charAt(i++);
if (digit < '0' || '9' < digit) {
return true;
} else if (maybeOutOfBounds) {
char maxdigit = max[j++];
if (maxdigit < digit) {
return true; // out of bounds
} else if (digit < maxdigit) {
maybeOutOfBounds = false;
}
}
}
return false;
}
मैं नहीं जानता कि हालांकि कौन सा संस्करण अधिक प्रभावी है। और यह ज्यादातर संदर्भ पर निर्भर करता है कि किस तरह के चेक उचित हैं।
सी # से चेक यदि कोई स्ट्रिंग परिवर्तित किया जा सकता है तो आप TryParse का उपयोग करेंगे। और यदि यह सच हो जाता है तो एक उपज के रूप में को एक ही समय में परिवर्तित किया गया। यह एक साफ सुविधा है और मुझे अपवाद फेंकने के बजाए नल लौटने के लिए केवल parseInt को पुन: कार्यान्वित करने में कोई समस्या नहीं दिखाई दे रही है।
लेकिन यदि आप पार्सिंग विधि को पुन: कार्यान्वित नहीं करना चाहते हैं तो यह अभी भी अच्छा हो सकता है कि आप विधियों का एक सेट रखें ताकि आप स्थिति के आधार पर उपयोग कर सकें। वे ऐसा दिखाई दे सकता:
private static Pattern QUITE_ACCURATE_INT_PATTERN = Pattern.compile("^-?0*\\d{1,10}$");
static Integer tryParseIntegerWhichProbablyResultsInOverflow(String s) {
Integer result = null;
if (!wouldParseIntThrowException(s)) {
try {
result = Integer.parseInt(s);
} catch (NumberFormatException ignored) {
// never happens
}
}
return result;
}
static Integer tryParseIntegerWhichIsMostLikelyNotEvenNumeric(String s) {
Integer result = null;
if (s != null && s.length() > 0 && QUITE_ACCURATE_INT_PATTERN.matcher(s).find()) {
try {
result = Integer.parseInt(s);
} catch (NumberFormatException ignored) {
// only happens if the number is too big
}
}
return result;
}
static Integer tryParseInteger(String s) {
Integer result = null;
if (s != null && s.length() > 0) {
try {
result = Integer.parseInt(s);
} catch (NumberFormatException ignored) {
}
}
return result;
}
static Integer tryParseIntegerWithoutAnyChecks(String s) {
try {
return Integer.parseInt(s);
} catch (NumberFormatException ignored) {
}
return null;
}
BTW, वहाँ हो रही है कि जावा में के लिए वैकल्पिक तरीकों होगा। एक int के बजाय इंटीजर का उपयोग होगा और दूसरा एक सरणी के भीतर int डालने और विधि को पास करने के लिए होगा। –
हाँ, यही कारण है कि मैंने "एक आदिम लौटने की इच्छा रखते हुए" भाग का उल्लेख किया। यह संभव है लेकिन अनिवार्य रूप से कभी साफ नहीं है। – Calum