2010-05-20 15 views
5

मेरे पास एक बहुत ही सरल सवाल है, और मुझे इस पर लटका नहीं जाना चाहिए, लेकिन मैं हूं। Haha!निम्न स्ट्रिंग को प्रारूपित करने का सबसे प्रभावी तरीका क्या है?

123456-D53

123455-4D

234234-4

123415:

मैं एक स्ट्रिंग है कि मैं निम्न स्वरूप (रों) में प्राप्त राशि

वांछित आउटपुट, पोस्ट स्वरूपण, है:

123-455-444

123-455-55

123-455-5

या

123-455

प्रारूप अंततः पर निर्भर है मूल स्ट्रिंग में वर्णों की कुल संख्या ..

मेरे पास सीवी है ऐसा करने के तरीके के आरएएल विचारों, लेकिन मैं बात रखने वहाँ string.Replace तुलना में एक बेहतर तरीका है और श्रेणीबद्ध ...

सुझाव के लिए धन्यवाद ..

इयान

+6

आप यह सुनिश्चित करें कि दक्षता सबसे महत्वपूर्ण मीट्रिक यहाँ और नहीं उदाहरण पठनीयता के लिए है? क्या आपने यह देखने के लिए प्रोफाइल किया है कि यह आपके कार्यक्रम में बाधा है? –

+1

दोनों खातों पर नहीं। वास्तव में, मुझे यकीन है कि यह एक बाधा नहीं है और यह दक्षता सबसे महत्वपूर्ण मीट्रिक नहीं है। मैं सिर्फ उत्सुक हूं और पूरे दिन इसके बारे में सोच रहा हूं। :) –

उत्तर

2

मुझे लगता है कि यह केवल इनपुट पर हमेशा भरोसा नहीं करता है? यदि हां, तो मैं इस

private string ApplyCustomFormat(string input) 
{ 
    StringBuilder builder = new StringBuilder(input.Replace("-", "")); 

    int index = 3; 
    while (index < builder.Length) 
    { 
     builder.Insert(index, "-"); 
     index += 4; 
    } 
    return builder.ToString(); 
} 
+0

यह मेरे कार्यान्वयन के समान है .. मैं बस यह करने के लिए सबसे प्रभावी तरीका है " प्रश्न .. –

+0

@ इयान पी - "सबसे कुशल" "कुशल पर्याप्त" से कम महत्वपूर्ण है। पहली टिप्पणी देखें। मैं "कम कुशल" कोड लिखने का लुत्फ उठाऊंगा जो एक आईनेमरेबल चंकर (विधि या रेगेक्स) और स्ट्रिंग का उपयोग करता है। जॉइन ;-) –

+0

इसे उत्तर के रूप में चुना गया है, क्योंकि यह पहले वर्णित नमूना के अनुसार काम करता था। हालांकि, अन्य पोस्टर ने अपने कोड को आवश्यकतानुसार काम करने के लिए अपडेट किया। सभी हरे रंग के चेकमार्क के योग्य हैं, लेकिन मैं केवल एक ही दे सकता हूं :) –

2

संपादित करें: के लिए इतिहास देखें पुराने संस्करणों।
आप केवल अंक खोजने के लिए char.IsDigit() का उपयोग कर सकते हैं। बाएं से दाएं

var output = new StringBuilder(); 
var digitCount = 0; 

foreach(var c in input) 
{ 
    if(char.IsDigit(c)) 
    { 
    output.Append(c); 
    digitCount++; 
    if(digitCount % 3 == 0) 
    { 
     output.Append("-"); 
    } 
    } 
} 

// Remove possible last - 
return output.ToString().TrimEnd('-'); 

इस कोड को भरना चाहिए (अब मैं इसे, पहले पढ़ा, तो कोड मिला है) ...
क्षमा करें, मैं अभी भी अब इस अधिकार का परीक्षण नहीं कर सकता।

+0

मैं अपनी मूल पोस्ट को स्पष्ट करने वाला हूं, स्ट्रिंग अल्फान्यूमेरिक हो सकती है, केवल संख्यात्मक नहीं। –

+0

मुझे लगता है कि यह संख्याओं को गलत दिशा में भरता है। वह चाहता है कि यह वाम-न्यायसंगत, बोलने के लिए। – user7116

+0

@Ian: अब मैं char.IsDigit का उपयोग करता हूं। @sixlettervariables: आप सही हैं, जो इसे और अधिक कठिन बनाता है। – tanascius

4

Tanascius की तरह कुछ के बारे में सोच रहा हूँ सही है, लेकिन मैं टिप्पणी या प्रतिनिधि की मेरी कमी के कारण वोट दें नहीं कर सकते, लेकिन यदि आप String.Format पर अतिरिक्त जानकारी चाहते Ive इस उपयोगी पाया। http://blog.stevex.net/string-formatting-in-csharp/

+0

ग्रेट लिंक, धन्यवाद। –

+0

मुझे आपको यह बताना चाहिए था कि मैंने अपना जवाब हटा दिया :-)। ओपी ने सवाल बदल दिया और यह अब लागू नहीं होता है। इसके अलावा, छः पत्रिका योग्य ने इंगित किया कि यह वास्तव में मूल प्रश्न का भी उत्तर नहीं देता है। –

0
नहीं आंखों पर

सबसे तेजी से है, लेकिन आसान (एड: पढ़ने के लिए):

string Normalize(string value) 
{ 
    if (String.IsNullOrEmpty(value)) return value; 

    int appended = 0; 
    var builder = new StringBuilder(value.Length + value.Length/3); 
    for (int ii = 0; ii < value.Length; ++ii) 
    { 
     if (Char.IsLetterOrDigit(value[ii])) 
     { 
      builder.Append(value[ii]); 
      if ((++appended % 3) == 0) builder.Append('-'); 
     } 
    } 

    return builder.ToString().TrimEnd('-'); 
} 

पूर्व आवंटित करने के लिए StringBuilder की लंबाई एक अनुमान उपयोग करता है। यह किसी भी अल्फान्यूमेरिक इनपुट को उपयोगकर्ता द्वारा अतिरिक्त जांघे सहित उपयोगकर्ता द्वारा जोड़े जाने वाले किसी भी जंक के साथ स्वीकार करेगा।

+6

हाहा, हमारे पास विभिन्न प्रकार की आंखें होनी चाहिए: पी –

+0

आपको '(ii + 1)% 3 == 0' की जांच करनी चाहिए। –

+0

@ 0xA3: अच्छी पकड़। @pst: अगर मैं इसे पढ़ने के लिए वापस आ रहा हूं, तो यह स्पष्ट होगा कि क्या हो रहा है। कोई obfuscation;) – user7116

2

यहां एक विधि है जो एक समय में तीन अक्षरों के समूहों को निकालने के लिए नियमित अभिव्यक्तियों और LINQ के संयोजन का उपयोग करती है और फिर उन्हें एक साथ मिलती है। नोट: यह मानता है कि इनपुट पहले से ही मान्य कर दिया गया है।सत्यापन नियमित अभिव्यक्ति के साथ भी किया जा सकता है।

string s = "123456-D53"; 
string[] groups = Regex.Matches(s, @"\w{1,3}") 
         .Cast<Match>() 
         .Select(match => match.Value) 
         .ToArray(); 
string result = string.Join("-", groups); 

परिणाम:

 
123-456-D53 
संबंधित मुद्दे

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