2011-12-14 16 views
78

Chcę przyciąć łańcuch, jeśli jego długość przekracza 10 znaków.Przytnij ciąg znaków na podstawie długości ciągu znaków

Załóżmy, że jeśli długość ciągu wynosi 12 (String s="abcdafghijkl"), nowy przycięty ciąg będzie zawierał "abcdefgh..".

Jak mogę to osiągnąć?

+5

możliwy duplikat [do pierwszych N znaków] (http://stackoverflow.com/questions/1583940/up-to-first-n-characters) –

Odpowiedz

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

Korzystanie Math.min takiego unika wyjątek w przypadku, gdy łańcuch jest już krótszy niż 10.


Uwagi:

  1. Powyższy robi prawdziwą przycinania. Jeśli chcesz zastąpić ostatnie trzy znaki (!) Kropkami, jeśli je skróci, użyj Apache Commons StringUtils.abbreviate.

  2. To może zachowywać się niepoprawnie , jeśli Twój ciąg zawiera punkty kodowe Unicode poza BMP; na przykład Emoji. Aby znaleźć rozwiązanie, które działa poprawnie dla wszystkich punktów kodu Unicode, zobacz @ sibnick's solution.


1 - kodowy Unicode nie ma na płaszczyźnie 0 (BMP) są reprezentowane jako "zastępczy pary" (to znaczy dwa char wartości) w String. Ignorując to, możemy przyciąć do mniej niż 10 punktów kodowych lub (gorzej) uciąć w środku pary zastępczej. Z drugiej strony, String.length() nie jest już idealną miarą długości tekstu Unicode, więc przycinanie na tej podstawie może być niewłaściwe.

+27

Trochę za późno na imprezę, ale jeśli używasz Apache commons StringUtils , Wolę używać s = StringUtils.left (s, 10), zamiast próbować uporządkować to, co projektant podłoży java próbował przekazać. Pozwala to również uniknąć horroru rzucania wyjątku, aby wykonać coś tak prostego, jak wyodrębnienie pierwszych kilku znaków z ciągu niepewnej długości, co jest nietypową operacją. –

+1

@SteeveMcCauley - W obronie projektantów Javy, podczas gdy jest nieco nieintuicyjne, że drugi argument 'split' jest znakiem pos po końcu podciągu, prawdopodobnie będzie również wygodniej robić to w ten sposób w większej liczbie przypadków. Poza tym jest to coś, co zapamiętuje * doświadczony * programista Java. –

+1

@SteeveMcCauley - i jest to coś, czego * niedoświadczeni * programiści java powinni przejrzeć w javadocs ... zamiast polegać na intuicji. –

10

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

+8

Drugi parametr podciągu jest wyłączny, więc ta odpowiedź przycina Ciąg do 9 znaków. – emulcahy

81

StringUtils.abbreviate z Apache Commons Lang biblioteki może być twoim przyjacielem:

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

To może być, ale pytanie OP nie pyta o "wielokropek". –

+4

@StephenC - Pytanie pokazuje 8 znaków, po których następują 2 kropki, z ograniczeniem długości 10, które jest podobne do elipsy (tylko 2 kropki zamiast 3). Jest również prawdopodobne, że wiele osób, które znajdą to pytanie, uznałoby wielokropek za użyteczny. – ToolmakerSteve

+0

thx dobry ... –

5

Albo można po prostu użyć tej metody w przypadku, gdy nie ma pod ręką: StringUtils

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

Jak zwykle nikt nie dba o pary zastępcze UTF-16. Zobacz o nich: What are the most common non-BMP Unicode characters in actual use? Nawet autorzy org.apache.commons/commons-lang3

można zobaczyć różnicę między zwykłym poprawnego kodu i kodu w tym przykładzie:

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

Jest StringUtils funkcja, która to robi .

s = StringUtils.left(s, 10) 

If Len znaków nie są dostępne, czy ciąg jest null, String zostaną zwrócone bez wyjątku. Pusty łańcuch jest zwracany, jeśli len jest ujemny.

StringUtils.left (null, ) = zero
StringUtils.lewo (
, -ve) = ""
StringUtils.left ("", *) = ""
StringUtils.left ("abc", 0) = ""
StringUtils.left ("abc", 2) = "ab"
StringUtils.left ("abc", 4) = "abc"

StringUtils.Left JavaDocs

Dzięki uprzejmości Steeve McCauley

1

wszelki wypadek szukasz sposobu na przyciąć i zachować OSTATNIE 10 znaków ciągu.

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

Powiązane problemy