यदि वे बहुत लंबे हैं तो मैं अपने स्ट्रिंग्स को "..." से कैसे काट सकता हूं?


84

आशा है कि किसी को एक अच्छा विचार है। मेरे पास इस तरह के तार हैं:

abcdefg
abcde
abc

उनके लिए मुझे इस तरह दिखाने के लिए क्या करना चाहिए, अगर एक निर्दिष्ट लेन से अधिक है:

abc ..
abc ..
abc

क्या इसके लिए कोई सरल C # कोड का उपयोग किया जा सकता है?


आप यह कहां करना चाह रहे हैं? - एक फॉर्म या WPF ऐप या वेबसाइट में - कृपया अधिक जानकारी प्रदान करें!
बैरी केय

2
अधिकांश समाधान के साथ समस्या यह है कि वे कई Charएस का उपयोग सीमा के रूप में करते हैं। दुर्भाग्य से चित्रमय चौड़ाई बहुत भिन्न हो सकती है। और फिर यूटीएफ -16 सरोगेट हैं, वर्णों का संयोजन, ...
कोड्स इनचोल्स

12
यह सुझाए गए प्रश्न का डुप्लिकेट नहीं है। यह एक बहुत ही सामान्य प्रश्न है जबकि सुझाया गया डुप्लिकेट एक अत्यंत विशिष्ट प्रश्न है।
जेसनमैर

2
यह बिल्कुल सुझाए गए प्रश्न का डुप्लिकेट नहीं है।
सेठ

2
यह प्रश्न सुझाए गए डुप्लिकेट के पास भी नहीं है कृपया डुप्लिकेट विशेषता को हटा दें। धन्यवाद।
डैनियल लीज़ेन

जवाबों:


146

यहाँ तर्क को विस्तार विधि में लपेटा गया है:

public static string Truncate(this string value, int maxChars)
{
    return value.Length <= maxChars ? value : value.Substring(0, maxChars) + "...";
}

उपयोग:

var s = "abcdefg";

Console.WriteLine(s.Truncate(3));

1
धन्यवाद ब्रायन। आपका उत्तर अच्छा लग रहा है। कृपया मेरे सरल प्रश्न का बहाना करें लेकिन मैं एक्सटेंशन पद्धति का उपयोग कैसे करूं?
Melony

1
@ मेलोनी: उपयोग शामिल करने के लिए संपादित किया गया।
ब्रायन वॉट्स

11
… (दीर्घवृत्त) देखभाल करने वालों के लिए सही प्रतीक है। यूनिकोड यू + 2026।
मलकाओ

3
एक शून्य जाँच शामिल करने के लिए त्वरित इसके अलावा
james

1
धन्यवाद @ मलैको: value.Substring(0, maxChars) + (char)0x2026;
पियरे

8
public string TruncString(string myStr, int THRESHOLD)
{
    if (myStr.Length > THRESHOLD)
        return myStr.Substring(0, THRESHOLD) + "...";
    return myStr;
}

नामकरण अधिवेशन को अनदेखा करें क्योंकि यह वास्तव में केवल THRESHOLD चर की जरूरत है या यदि यह हमेशा एक ही आकार का हो।

वैकल्पिक रूप से

string res = (myStr.Length > THRESHOLD) ? myStr.Substring(0, THRESHOLD) + ".." : myStr;

क्या यह संभव है कि एक पंक्ति में कुछ ऐसा करूं जिससे मैं इनलाइन का उपयोग कर सकूं?
Melony

2
अगर यह बीच में एक
कोडपॉइंट को

7

सभी बहुत अच्छे उत्तर, लेकिन इसे थोड़ा साफ करने के लिए, यदि आपके तार वाक्य हैं, तो एक शब्द के बीच में अपनी स्ट्रिंग को न तोड़ें।

private string TruncateForDisplay(this string value, int length)
{
  if (string.IsNullOrEmpty(value)) return string.Empty;
  var returnValue = value;
  if (value.Length > length)
  {
    var tmp = value.Substring(0, length) ;
    if (tmp.LastIndexOf(' ') > 0)
       returnValue = tmp.Substring(0, tmp.LastIndexOf(' ') ) + " ...";
  }                
  return returnValue;
}

यह एकमात्र उत्तर है जो शब्दों को तोड़ता नहीं है। इसलिए केवल एक आईएमओ सही है।
mxmissile

@mxmissile - "abcdefg" के लिए ओपी डेटा दिया, 3 वर्णों में छोटा, "abc ..." में जाता है, भले ही यह काम किया हो, यह बिल्कुल भी सही नहीं होगा। ओपी नमूना डेटा स्पष्ट रूप से सन्निहित पाठ के बीच में एक कठिन ट्रंकट को इंगित करता है। इससे भी बदतर, जैसा कि यह है, यह उत्तर एक त्रुटि उत्पन्न करेगा। चूंकि डेटा में कोई स्थान नहीं है, इसलिए LastIndexOf-1 लौटाएगा, और Substringरनटाइम त्रुटि का कारण होगा।

4

यहाँ एक संस्करण है जो दीर्घवृत्त की लंबाई के लिए खाता है:

    public static string Truncate(this string value, int maxChars)
    {
        const string ellipses = "...";
        return value.Length <= maxChars ? value : value.Substring(0, maxChars - ellipses.Length) + ellipses;
    }

4
यदि आप दीर्घवृत्त वर्ण का उपयोग करते हैं, तो उसके लिए कोई आवश्यकता नहीं है। यह चरित्र की लंबाई हमेशा 1const char ellipse = (char)0x2026;
पियरे

3

.NET फ्रेमवर्क में कोई अंतर्निहित पद्धति नहीं है जो ऐसा करती है, हालांकि यह अपने आप को लिखने के लिए एक बहुत ही आसान तरीका है। यहाँ कदम हैं, इसे स्वयं बनाने का प्रयास करें और हमें बताएं कि आप क्या कर रहे हैं।

  1. एक विधि, शायद एक विस्तार विधि बनाएँ public static void TruncateWithEllipsis(this string value, int maxLength)

  2. यह देखने के लिए जांचें कि क्या मूल्य में पारित संपत्तिmaxLength का उपयोग करके निर्दिष्ट से अधिक है । यदि इससे अधिक नहीं है , तो बस वापस लौटें ।LengthvaluemaxLengthvalue

  3. यदि हम मूल्य के रूप में पारित नहीं लौटा है, तो हम जानते हैं कि हमें अलग करना होगा। इसलिए हमें SubStringविधि का उपयोग करके स्ट्रिंग का एक छोटा सा खंड प्राप्त करने की आवश्यकता है । यह पद्धति एक निर्दिष्ट प्रारंभ और अंत मूल्य के आधार पर एक स्ट्रिंग के एक छोटे से भाग को लौटा देगी। अंतिम स्थिति maxLengthपैरामीटर द्वारा पारित की गई थी , इसलिए इसका उपयोग करें।

  4. स्ट्रिंग के उप सेक्शन को वापस करें और साथ ही दीर्घवृत्त।

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


2

कोड के पीछे:

string shorten(sting s)
{
    //string s = abcdefg;
    int tooLongInt = 3;

    if (s.Length > tooLongInt)
        return s.Substring(0, tooLongInt) + "..";

    return s;
}

मार्कअप:

<td><%= shorten(YOUR_STRING_HERE) %></td>

मैं इसे कैसे फिट कर सकता हूं: "<td>" + string + "<\ td>"?
मेलोनी जूल

2

शायद इस उद्देश्य के लिए एक विधि लागू करना बेहतर है:

string shorten(sting yourStr)
{
//Suppose you have a string yourStr, toView and a constant value 

    string toView;
    const int maxView = 3;

    if (yourStr.Length > maxView)
        toView = yourStr.Substring(0, maxView) + " ..."; // all you have is to use Substring(int, int) .net method
    else
        toView = yourStr;
return toView;
}

1
string s = "abcdefg";
if (s.length > 3)
{
    s = s.substring(0,3);
}

आप फ्यूलिंग फ़ंक्शन का उपयोग कर सकते हैं।


1

"C # truncate ellipsis" की खोज के बाद मुझे यह प्रश्न मिला। विभिन्न उत्तरों का उपयोग करते हुए, मैंने निम्नलिखित विशेषताओं के साथ अपना समाधान बनाया:

  1. एक विस्तार विधि
  2. एक दीर्घवृत्त जोड़ें
  3. एलिप्सिस को वैकल्पिक बनाएं
  4. पुष्टि करें कि स्ट्रिंग इसे कम करने का प्रयास करने से पहले अशक्त या रिक्त नहीं है।

    public static class StringExtensions
    {
        public static string Truncate(this string value, 
            int maxLength, 
            bool addEllipsis = false)
        {
            // Check for valid string before attempting to truncate
            if (string.IsNullOrEmpty(value)) return value;
    
            // Proceed with truncating
            var result = string.Empty;
            if (value.Length > maxLength)
            {
                result = value.Substring(0, maxLength);
                if (addEllipsis) result += "...";
            }
            else
            {
                result = value;
            }
    
            return result;
        }
    }
    

मैं उम्मीद करता हूं कि इससे किसी की मदद होगी।



0

मुझे हाल ही में यह समस्या है। मैं nvarcharMAX DB क्षेत्र में एक "स्थिति" संदेश संग्रहीत कर रहा था जो 4000 वर्णों का है। हालाँकि मेरे स्टेटस मैसेज अपवाद बना रहे थे और मार रहे थे।

लेकिन यह मनमाने ढंग से छंटनी के रूप में छंटनी का एक साधारण मामला नहीं था, एक स्थिति संदेश का अनाथ हिस्सा होगा, इसलिए मुझे वास्तव में स्ट्रिंग के एक सुसंगत भाग में "छंटनी" करने की आवश्यकता थी।

मैंने स्ट्रिंग को स्ट्रिंग सरणी में परिवर्तित करके, पहले तत्व को हटाकर और फिर स्ट्रिंग को पुनर्स्थापित करके समस्या को हल किया। यहाँ कोड है ("CurrentStatus" स्ट्रिंग डेटा पकड़े हुए है) ...

        if (CurrentStatus.Length >= 3750)
        {
            // perform some truncation to free up some space.

            // Lets get the status messages into an array for processing...
            // We use the period as the delimiter, then skip the first item and re-insert into an array.

            string[] statusArray = CurrentStatus.Split(new string[] { "." }, StringSplitOptions.None)
                                    .Skip(1).ToArray();

            // Next we return the data to a string and replace any escaped returns with proper one.
            CurrentStatus = (string.Join(".", statusArray))
                                    .Replace("\\r\\n", Environment.NewLine);


        }

आशा है कि यह किसी को बाहर करने में मदद करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.