2011-12-07 6 views
7

मैं एक फॉर्म से उपयोगकर्ता इनपुट मान्य कर रहा हूँ।जावा में नंबरफॉर्मैट की तुलना में संख्याओं को और अधिक सख्त कैसे पार्स करें?

मैं NumberFormat के साथ इनपुट को पार्स करता हूं, लेकिन यह बुरा है और लगभग कुछ भी अनुमति देता है। क्या संख्या को अधिक सख्त करने का कोई तरीका है?

उदा। मैं एक पूर्णांक के लिए इन तीन आदानों की अनुमति नहीं करना चाहते हैं, लेकिन Numberformat उन सभी को अनुमति देते हैं:

NumberFormat nf = NumberFormat.getNumberInstance(); 
nf.setParseIntegerOnly(true); 

Number numberA = nf.parse("99.731"); // 99 (not what the user expect) 
Number numberB = nf.parse("99s.231"); // 99 (invalid) 
Number numberC = nf.parse("9g9");  // 9 (invalid) 

System.out.println(numberA.toString()); 
System.out.println(numberB.toString()); 
System.out.println(numberC.toString()); 
+0

कि यह कैसे एक स्ट्रिंग में कनवर्ट करने के बारे में और उसके बाद अनुकूलित कर सकते हैं स्ट्रिंग पर लूप और केवल अक्षर "0" .. "9" की अनुमति दें?या बस getIntegerInstance() के लिए जाओ; – ComputerSaysNo

+0

@ डोरिनडिमिनिका: 'getIntegerInstance()' एक ही परिणाम देता है। – Jonas

+1

क्यों नहीं 'Integer.parseInt (स्ट्रिंग) ' –

उत्तर

1

आप एक पूर्णांक एक वैकल्पिक से मिलकर पार्स करने के लिए चाहते हैं '-' 1 या अधिक दशमलव संख्याएं आती हैं, तो

int num = Integer.parseInt(str); 

या

long num = Long.parseLong(str); 

आप बस चाहते हैं पूर्णांक रूपांतरण को मान्य करें और न करें, फिर एक रेगेक्स एक और विकल्प है; जैसे

boolean ok = Pattern.compile("-?\\d+").matches(str); 
+0

या 'str.matches ("-? \\ d +") '। –

3

वहाँ ऐसा करने के लिए कई तरीके हैं:

0

एक प्रारूप पैटर्न स्ट्रिंग के साथ decimalFormat का उपयोग करें।

+0

' DecimalFormat' का उपयोग इस समस्या में क्यों नहीं है। या आपके पास एक उदाहरण है? – Jonas

2

Integer.parseInt(String) आपके सभी उदाहरणों पर नंबरफॉर्मेट अपवाद फेंक देगा। मुझे यकीन नहीं है कि आप यही चाहते हैं, लेकिन यह निश्चित रूप से "अधिक सख्त" है।

6

हो सकता है कि इस मदद करता है:

String value = "number_to_be_parsed".trim(); 
NumberFormat formatter = NumberFormat.getNumberInstance(); 
ParsePosition pos = new ParsePosition(0); 
Number parsed = formatter.parse(value, pos); 
if (pos.getIndex() != value.length() || pos.getErrorIndex() != -1) { 
    throw new RuntimeException("my error description"); 
} 

(Strict number parsing at mynetgear.net के लिए धन्यवाद)

+0

धन्यवाद - यह एकमात्र वास्तविक हल करने का उत्तर है! दूसरा स्थानीय नहीं मानते (जैसे दशमलव डेलीमीटर)। बस सोच रहा है कि डिफ़ॉल्ट कार्यान्वयन में यह क्यों नहीं है (कम से कम कॉन्फ़िगर करने योग्य) :( – Rainer

0

मैं जावा की संख्या प्रारूप दिनचर्या का उपयोग नहीं होगा, खासकर स्थान सेटिंग्स के साथ करता है, तो आप सत्यापन के बारे में चिंता।

Locale numberLocale = new Locale(“es”,”ES"); 
    NumberFormat nf = NumberFormat.getInstance(numberLocale); 
    ParsePosition pos = new ParsePosition(0); 
    Number test = nf.parse("0.2", pos); 

आप उम्मीद करते हैं यहाँ एक मुद्दा है, लेकिन कोई .. परीक्षण 2 के बराबर है और स्थिति 3 और -1 की त्रुटि सूचकांक का एक सूचकांक है।

0

मैं अपने ही मान्यता वर्ग लिखने पर छोड़ दिया, और NEBULA WIDGETSFormattedText

यह SWT विजेट एपीआई के ऊपर लिखा गया था के साथ चला गया, लेकिन आप आसानी से NumberFormatter class

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