2011-12-14 15 views
78

पर आधारित स्ट्रिंग को ट्रिम करें यदि लंबाई 10 वर्णों से अधिक हो तो मैं एक स्ट्रिंग को ट्रिम करना चाहता हूं।स्ट्रिंग लंबाई

मान लीजिए कि स्ट्रिंग लंबाई 12 (String s="abcdafghijkl") है, तो नई छंटनी वाली स्ट्रिंग में "abcdefgh.." होगा।

मैं इसे कैसे प्राप्त कर सकता हूं?

+5

[पहले एन अक्षरों तक] [http://stackoverflow.com/questions/1583940/up-to-first-n-characters) के संभावित डुप्लिकेट –

उत्तर

156
s = s.substring(0, Math.min(s.length(), 10)); 

Math.min इस तरह का प्रयोग इस मामले में जहां स्ट्रिंग पहले से ही 10 तुलना में कम है में एक अपवाद बचा जाता है।


नोट्स:

  1. ऊपर असली ट्रिमिंग करता है। यदि आप वास्तव में पिछले तीन (!) वर्णों को डॉट्स के साथ प्रतिस्थापित करना चाहते हैं, तो यह अपाचे कॉमन्स StringUtils.abbreviate का उपयोग करें।

  2. यह गलत तरीके से व्यवहार कर सकता है यदि आपकी स्ट्रिंग में बीएमपी के बाहर यूनिकोड कोडपॉइंट्स हैं; जैसे Emojis। ऐसे समाधान के लिए जो सभी यूनिकोड कोड-पॉइंट्स के लिए सही तरीके से काम करता है, @ sibnick's solution देखें।


1 - एक यूनिकोड कोडपॉइंट है कि विमान 0 (बीएमपी) पर नहीं है String में एक "किराए की जोड़ी" (यानी दो char मान) के रूप में प्रतिनिधित्व किया है। इसे अनदेखा करके, हम एक सरोगेट जोड़ी के बीच में 10 से कम कोड अंक, या (बदतर) छंटनी कर सकते हैं। दूसरी तरफ, String.length() अब यूनिकोड टेक्स्ट की लंबाई का आदर्श उपाय नहीं है, इसलिए इसके आधार पर ट्रिमिंग करना गलत काम हो सकता है।

+27

पार्टी के लिए थोड़ा देर हो चुकी है, लेकिन यदि अपाचे कॉमन्स स्ट्रिंगयूटिल का उपयोग करना है , मैं जावा के सबस्ट्रिंग() के डिजाइनर जो कुछ भी व्यक्त करने की कोशिश कर रहा था उसे हल करने की कोशिश करने के बजाय एस = स्ट्रिंगयूटिल्स बाएं (एस, 10) का उपयोग करना पसंद करता हूं। यह अनिश्चित लंबाई की एक स्ट्रिंग से पहले कुछ वर्ण निकालने के रूप में सरल कुछ करने के लिए अपवाद फेंकने की भयावहता से भी बचाता है, असामान्य ऑपरेशन नहीं। –

+1

@SteeveMcCauley - जावा डिजाइनरों की रक्षा में, जबकि यह थोड़ा गैर-सहज ज्ञान युक्त है कि 'विभाजन' का दूसरा तर्क सबस्ट्रिंग के अंत के बाद चरित्र pos है, यह भी ऐसा करने के लिए और अधिक सुविधाजनक होने की संभावना है अधिक मामलों में। इसके अलावा, यह ऐसा कुछ है जो एक * अनुभवी * जावा प्रोग्रामर बस याद करता है। –

+1

@SteeveMcCauley - और यह कुछ ऐसा है जो * अनुभवहीन * जावा प्रोग्रामर को अंतर्ज्ञान पर भरोसा करने के बजाय javadocs में देखना चाहिए ...। –

10

s = s.length() > 10 ? s.substring(0, 9) : s;

+8

सबस्ट्रिंग का दूसरा पैरामैन अनन्य है, इसलिए यह उत्तर स्ट्रिंग को 9 वर्णों तक ट्रिम करता है। – emulcahy

81

Apache Commons Lang पुस्तकालय से StringUtils.abbreviate अपने दोस्त हो सकता है:

StringUtils.abbreviate("abcdefg", 6) = "abc..." 
StringUtils.abbreviate("abcdefg", 7) = "abcdefg" 
StringUtils.abbreviate("abcdefg", 8) = "abcdefg" 
StringUtils.abbreviate("abcdefg", 4) = "a..." 
+4

यह हो सकता है, लेकिन ओपी का सवाल "एलिप्सिस" के लिए नहीं पूछता है। –

+4

@StephenC - प्रश्न 8 वर्णों के बाद 8 वर्णों के बाद दिखाता है, जो 10 की लंबाई सीमा प्रदान करता है, जो एक इलिप्सिस की तरह है (केवल 3 बिंदुओं के बजाय 2 बिंदु)। यह भी संभावना है कि इस सवाल को ढूंढने वाले बहुत से लोग इलिप्सिस को उपयोगी मानेंगे। – ToolmakerSteve

+0

thx अच्छा एक ... –

5

या आप बस के मामले में इस विधि का उपयोग कर सकते हैं हाथ पर StringUtils की जरूरत नहीं है:

public static String abbreviateString(String input, int maxLength) { 
    if (input.length() <= maxLength) 
     return input; 
    else 
     return input.substring(0, maxLength-2) + ".."; 
} 
10

सामान्य रूप से कोई भी यूटीएफ -16 सरोगेट जोड़े की परवाह नहीं करता है। उनके बारे में देखें: org.apache.commons/कॉमन्स-lang3 की What are the most common non-BMP Unicode characters in actual use? यहां तक ​​कि लेखकों

आप इस नमूने में सही कोड और हमेशा की तरह कोड के बीच अंतर देख सकते हैं:

public static void main(String[] args) { 
    //string with FACE WITH TEARS OF JOY symbol 
    String s = "abcdafghi\uD83D\uDE02cdefg"; 
    int maxWidth = 10; 
    System.out.println(s); 
    //do not care about UTF-16 surrogate pairs 
    System.out.println(s.substring(0, Math.min(s.length(), maxWidth))); 
    //correctly process UTF-16 surrogate pairs 
    if(s.length()>maxWidth){ 
     int correctedMaxWidth = (Character.isLowSurrogate(s.charAt(maxWidth)))&&maxWidth>0 ? maxWidth-1 : maxWidth; 
     System.out.println(s.substring(0, Math.min(s.length(), correctedMaxWidth))); 
    } 
} 
20

एक StringUtils समारोह जो ऐसा करता है ।

s = StringUtils.left(s, 10) 

लेन पात्रों उपलब्ध नहीं हैं, या स्ट्रिंग रिक्त है, तो स्ट्रिंग एक अपवाद के बिना लौटा दी जाएगी। लेन ऋणात्मक होने पर एक खाली स्ट्रिंग वापस कर दी जाती है।

स्ट्रिंगयूटिलस बाएं (शून्य, ) = शून्य
स्ट्रिंगयूट्स।बाएं (
, -ve) = ""
StringUtils.left ("", *) = ""
StringUtils.left ("abc", 0) = ""
StringUtils.left ("abc", 2) = "ab"
StringUtils.left ("abc", 4) = "abc"

StringUtils.Left JavaDocs

सौजन्य: Steeve McCauley

1

बस मामले में आप के लिए एक रास्ता तलाश कर रहे हैं ट्रिम करें और स्ट्रिंग के अंतिम 10 अक्षर रखें।

एस = s.substring (Math.max (s.length(), 10) - 10);

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