2016-07-20 8 views
5

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

public static void main(String[] args) { 
    Scanner input = new Scanner(System.in); 

    System.out.print("Enter the amount of money " 
          + "and specify currency (USD or CNY): "); 

    // initialize variable moneyInput 
    BigDecimal moneyInput; 

    // check if moneyInput is numeric 
    try { 
     moneyInput = input.nextBigDecimal(); 
    } catch (InputMismatchException e){ 
     System.err.println("InputMismatchException: non-numeric value"); 
     return; 
    } 

    // specify currency of moneyInput 
    String currencyType = input.next(); 

    ... 
} 

तो यहां, 100.00 USD जैसे इनपुट, ठीक काम करता है।

Enter the amount of money and specify currency (USD or CNY): 100.00 USD 
$100.00 USD ≈ ¥670.17 CNY 

ASDF USD की तरह एक इनपुट उचित रूप से त्रुटि संदेश प्राप्त होते हैं।

Enter the amount of money and specify currency (USD or CNY): ASDF USD 
InputMismatchException: non-numeric value 

लेकिन, मैं कैसे कार्यक्रम, खाली आदानों का जवाब करने के लिए या तो तुरंत वापस कुंजी दबाने या पहली पंक्ति में रिक्त स्थान का एक समूह में प्रवेश करने के लिए मजबूर करते हैं? उदाहरण के लिए:

Enter the amount of money and specify currency (USD or CNY): 





1000.00 USD 
$1000.00 USD ≈ ¥6701.70 CNY 

उपरोक्त उदाहरण में, उपयोगकर्ता केवल अनिश्चित काल तक कुछ पठनीय (मान्य है या अमान्य) दर्ज किया है कुंजी दबाएं कर सकते हैं। मैं यह जांचने के लिए कुछ तरीका कार्यान्वित करना चाहता हूं कि उपयोगकर्ता ने कुछ भी सार्थक दर्ज किए बिना रिटर्न कुंजी दबाया है या नहीं।

एक और परिणाम जो मुझे नहीं पता कि कैसे खाते हैं, यह है कि यदि उपयोगकर्ता केवल मौद्रिक मूल्य में प्रवेश करता है, तो अंततः मुद्रा को इनपुट करने से पहले [वापसी] प्रेस का एक गुच्छा दबाता है।

उदाहरण:

Enter the amount of money and specify currency (USD or CNY): 100.00 



USD 
$100.00 USD ≈ ¥670.17 CNY 

मैं इस कार्यक्रम एक अंकीय मान के बाद Please specify the currency: की तरह कुछ के साथ उपयोगकर्ता संकेत करने के लिए कैसे मिलता है है इनपुट और उपयोगकर्ता प्रेस [वापसी]? जैसे

Enter the amount of money and specify currency (USD or CNY): 100.00 
Please specify the currency: USD 
$100.00 USD ≈ ¥670.17 CNY 

कुछ मैं करने के लिए कोशिश कैच ब्लॉक के बाद वाले हिस्से को बदलने के द्वारा ऊपर कार्यक्षमता को प्राप्त करने में सक्षम था:

input.nextLine(); 
System.out.print("Please specify the currency: "); 
String currencyType = input.nextLine(); 

लेकिन इस पद्धति का उपयोग, कार्यक्रम उपयोगकर्ता अनुमति देने के लिए क्षमता खो देता है पहले उदाहरण में, एक पंक्ति में moneyInput और currencyType दोनों इनपुट करने के लिए। (और फिर भी, अभी तक कुछ पठनीय अंत में इनपुट होने तक इन सभी संकेतों के लिए अनिश्चित काल तक [वापसी] प्रेस करने में सक्षम होने की समस्या है)।

लंबी पोस्ट के लिए पढ़ने और खेद के लिए धन्यवाद। और कभी कभी परस्पर विरोधी - -

उत्तर

10

Scanner दो बुनियादी प्रदान करता है उपयोग के मामलों:

  1. पढ़ें टोकन द्वारा इनपुट, inbetween कोई श्वेत रिक्ति अनदेखी (यह क्या अपने प्रारंभिक कोड करता है)
  2. लाइन द्वारा इनपुट पढ़ें, उन पंक्तियों की किसी भी सामग्री का इलाज किए बिना विशेष रूप से

आम तौर पर दोनों को मिलाकर एक खराब विचार है (यह काम करता है, लेकिन शायद आप कैसे इरादा नहीं करते हैं)। टोकन-रीडिंग विधियों जैसे next() और nextBigDecimal() न्यूलाइन को अनदेखा करते हैं।

आप आप Scanner.nextLine() के साथ एक उपयोगकर्ता के इनपुट पंक्ति-दर-पंक्ति पढ़ सकते हैं और व्यक्तिगत रूप से प्रत्येक पंक्ति को पार्स (अर्थात line.split("\\s+")) की जरूरत दर्ज करें, बजाय Scanner के टोकन-पढ़ने तरीकों का उपयोग को संभालने के लिए चाहते हैं।

कुछ लोगों को नेस्टेड Scanner s का उपयोग और उसके बाद सिर्फ इतना है कि लाइन tokenize के लिए एक नया Scanner में लाइन से गुजरती एक Scanner साथ लाइन द्वारा इनपुट लाइन को पढ़ने के लिए पसंद है।

उदाहरण के लिए:

try (Scanner in = new Scanner(System.in)) { 
    while (in.hasNextLine()) { 
    try { 
     String line = in.nextLine(); 
     Scanner lineScan = new Scanner(line); 
     BigDecimal moneyInput = lineScan.nextBigDecimal(); 
     String currency = lineScan.next(); 
     // do something 
    } catch (NoSuchElementException | IllegalStateException e) { 
     System.err.print("Please enter the VALUE followed by the CURRENCY"); 
    } 
    } 
} 

आप का उपयोग नहीं करना चाहते हैं, तो एक नेस्टेड Scanner वहाँ अन्य मोटे तौर-बराबर तंत्र हैं कर रहे हैं। यहाँ सार है, लेकिन आप की संभावना अतिरिक्त त्रुटि हैंडलिंग कोड जोड़ना चाहें, (जैसे new BigDecimal() एक अपवाद फेंकता है तो:

String.split() का उपयोग करना:

String[] parts = line.split("\\s+"); 
if (parts.length == 2) { 
    BigDecimal moneyInput = new BigDecimal(parts[0]); 
    String currency = parts[1]; 
    // do something 
} else { 
    System.err.println("Please enter the VALUE followed by the CURRENCY"); 
} 

Pattern का उपयोग करना:

/** 
* Matches one or more digits, optionally followed by a . and more digits, 
* followed by whitespace then one or more uppercase letters. 
*/ 
private static final Pattern MONEY_PATTERN = 
    Pattern.compile("(\\d+(?:\\.\\d+))\\s+([A-Z]+)"); 

फिर:

Matcher m = MONEY_PATTERN.matcher(line); 
if (m.matches()) { 
    BigDecimal moneyInput = new BigDecimal(m.group(1)); 
    String currency = m.group(2); 
// do something 
} else { 
    System.err.println("Please enter the VALUE followed by the CURRENCY"); 
} 
+0

हाय, क्या आप कृपया एक ही परिणाम प्राप्त करने के लिए 'line.split (" \\ s + ") 'के साथ पार्स विधि का उपयोग कैसे कर सकते हैं? मैं उस विधि से परिचित नहीं हूं इसलिए मुझे वाक्यविन्यास के साथ कठिन समय हो रहा है। धन्यवाद –

+1

और उदाहरण जोड़े गए। – dimo414

+0

ठीक है, मैं अलग-अलग जांच कैसे कर सकता हूं कि 'मुद्रा' मान्य है या नहीं? मैं इसे 'moneyInput' के साथ उसी तरह कार्य करना चाहता हूं, यानी यदि '100.00 abc' या' 100.00' जैसे कुछ दर्ज किया गया है, तो उपयोगकर्ता को बार-बार' मुद्रा' के लिए संकेत दिया जाता है, और एक बार जब वे वैध मुद्रा दर्ज करते हैं, यूएसडी ', कार्यक्रम सामान्य रूप से फिर से शुरू होता है। मैंने मुद्रा की जांच करने के लिए अंदर एक और डू-लूप लूप का उपयोग करने की कोशिश की, और यह एक खाली इनपुट दर्ज किए जाने के अलावा काम करता था, जो मूल रूप से एक ही समस्या है जो मेरे पास इस पोस्ट की शुरुआत में थी (यहां मेरा कोड है: http: // पेस्टबिन .com/raw/CT0qjBPk और प्रोग्राम स्क्रीनशॉट: http://imgur.com/a/mjfaL)। –

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