2012-06-12 10 views
10

बनाने के लिए स्ट्रिंग से संख्याएं निकालें मुझे कुछ खराब प्रारूपित डेटा दिया गया है और तारों से संख्याओं को खींचने की आवश्यकता है। मुझे यकीन नहीं है कि ऐसा करने का सबसे अच्छा तरीका क्या है। संख्याएं कोई लंबाई हो सकती हैं।केवल स्ट्रिंग

string a = "557222]]>"; 
string b = "5100870<br>"; 

किसी भी विचार मैं क्या कर सकता तो मैं इस मिलेगा:

a = "557222" 
b = "5100870" 

धन्यवाद

समाधान सी # के लिए खेद है। इस टैग को टैग करने के लिए

+0

क्या आपका मतलब सी या सी # है? –

+0

क्या आपके खराब नंबर में "खराब डेटा" हो सकता है? –

+0

नहीं, यह केवल सिरों पर होगा। Regex के लिए – kevp

उत्तर

8

सटीक कोड के लिए .NET के साथ पर्याप्त परिचित नहीं है। फिर भी, दो दृष्टिकोण होंगे:

  • इसे पूर्णांक के रूप में कास्ट करें। यदि गैर अंकों वाले अक्षर अंत में हैं (यानी 21389abc), यह सबसे आसान है।
  • यदि आपने गैर-अंकों के अक्षरों (यानी 1231a23v) इंटरमीस्ड किया है और प्रत्येक अंक रखना चाहते हैं, तो गैर-अंकों के वर्णों को बदलने के लिए regex [^\d] का उपयोग करें।
+2

+1। सी # के साथ आप कुछ का उपयोग कर सकते हैं, 'Regex.split (str, "[^ \ d]")' और 'string.join (" ", Regex.split (...)) 'फ़ंक्शन का उपयोग करें। – Ryan

+0

@ रयान, धन्यवाद। .NET में कभी गहरा नहीं हुआ। लेकिन तर्क भाषा से आगे निकलता है :) –

+2

स्प्लिट/जॉइन गड़बड़ के बजाय, एक आसान समाधान है: नया रेगेक्स (@ "\ डी")। बदलें (स्रोत ?? "", ""); –

29

आप सभी गैर अंकों पात्रों बाहर निकालने के लिए, हालांकि यह चल बिन्दु डेटा को संभाल नहीं होगा एक सरल विधि लिख सकते हैं:

public string ExtractNumber(string original) 
{ 
    return new string(original.Where(c => Char.IsDigit(c)).ToArray()); 
} 

यह विशुद्ध रूप से बाहर खींचती है "अंक" - आप भी कर सकते थे Char.IsDigit के बजाय Char.IsNumber का उपयोग करें, जो परिणाम आप चाहते हैं उसके आधार पर।

+0

IsDigit निम्नलिखित को खींचता है; अंश, सबस्क्रिप्ट, सुपरस्क्रिप्ट, रोमन अंक, मुद्रा संख्याएं, घेरने वाली संख्याएं, और स्क्रिप्ट-विशिष्ट अंक। आप "अंकों को पूरी तरह खींचते हैं" बताकर किसी को इंप्रेशन दे सकते हैं। केवल 0-9 अक्षर प्राप्त करने के लिए मेरा उत्तर देखें। – Atters

7

आप एक सरल रेगुलर एक्सप्रेशन का उपयोग कर सकते हैं:

var numericPart = Regex.Match(a, "\\d+").Value; 

आप इसे की जरूरत है एक वास्तविक संख्यात्मक मान होना करने के लिए, आप तो int.Parse या int.TryParse उपयोग कर सकते हैं।

3

इस

string number = Regex.Match("12345<br>", @"\d+").Value; 

इस अंक के पहले समूह वापस आ जाएगी की कोशिश करो। उदाहरण: इनपुट "a 123 b 456 c" के लिए यह "123" वापस करेगा।

3

प्रश्न स्पष्ट रूप से यह नहीं बताता है कि आप केवल 0 से 9 अक्षर चाहते हैं, लेकिन यह विश्वास करने के लिए एक खिंचाव नहीं होगा कि यह आपके उदाहरण सेट और टिप्पणियों से सच है। तो यहां वह कोड है जो ऐसा करता है।

 string digitsOnly = String.Empty; 
     foreach (char c in s) 
     { 
      // Do not use IsDigit as it will include more than the characters 0 through to 9 
      if (c >= '0' && c <= '9') digitsOnly += c; 
     } 

तुम क्यों Char.IsDigit का उपयोग नहीं करना चाहते हैं() - नंबर इस तरह के भिन्न, सबस्क्रिप्ट, सुपरस्क्रिप्ट, रोमन अंकों, मुद्रा अंश, संख्या घेर लिया, और स्क्रिप्ट विशेष अंकों के रूप में चरित्र शामिल हैं।

10

इस ऑनलाइनर को आजमाएं: Regex.Replace (str, "[^ 0-9 _]", "");

+0

यह फ़्लोटिंग पॉइंट नंबरों के लिए काम नहीं करता है क्योंकि यह डॉट और नकारात्मक चिह्न को हटा देता है। –

4

आप LINQ का उपयोग कर सकते हैं। नीचे दिया गया कोड स्ट्रिंग को केवल अंकों के साथ एक आईनेमरेबल में फ़िल्टर करता है और फिर उसे char [] में परिवर्तित करता है। स्ट्रिंग कन्स्ट्रक्टर फिर char [] को स्ट्रिंग में परिवर्तित कर सकता है:

string a = "557222]]>"; 
string b = "5100870<br>"; 

a = new string(a.Where(x => char.IsDigit(x)).ToArray()); 
b = new string(b.Where(x => char.IsDigit(x)).ToArray()); 
संबंधित मुद्दे