Tagliare una stringa in base alla lunghezza della stringa

Voglio tagliare una stringa, se la lunghezza supera i 10 caratteri.

Se supponiamo che la lunghezza della stringa di 12 (String s="abcdafghijkl"), quindi il nuovo tagliato stringa conterrà "abcdefgh..".

Come posso realizzare questo?

InformationsquelleAutor yshak | 2011-12-14

 

10 Replies
  1. 214
    s = s.substring(0, Math.min(s.length(), 10));

    Utilizzando Math.min come questo evita un’eccezione nel caso in cui la stringa è già inferiore 10.


    Note:

    1. Di cui sopra non reale taglio. Se effettivamente si vuole sostituire gli ultimi tre (!) personaggi con punti se si tronca, quindi utilizzare Apache Commons StringUtils.abbreviate.

    2. Questo potrebbe comportarsi in modo non corretto1 se la Stringa contiene Unicode codepoint al di fuori del BMP; ad esempio Emojis. Per una (più complicato) soluzione che funziona correttamente per tutti di codice Unicode-punti, vedi @sibnick del soluzione.


    1 – Un punto di codice Unicode che non è piano 0 (BMP) è rappresentato come una “coppia di surrogati” (cioè due char valori) nel String. Ignorando questo, si potrebbe tagliare a meno di 10 punti di codice, o (peggio) troncare nel mezzo di una coppia di surrogati. D’altra parte, String.length() non è più una misura ideale di testo Unicode, la lunghezza, in modo ritaglio basato su di esso può essere la cosa sbagliata da fare.

    • Invece di per la Matematica.min non si può fare un controllo condizionale e fare sottostringa solo se la stringa è di max quindi necessario ? ad esempio: s = (s.length() > 10) ? s.substring(0,10) : s ;
    • Sì, naturalmente è possibile. Leggi le altre risposte di altri modi per risolvere il problema!
  2. 107

    StringUtils.abbreviare da Apache Commons Lang biblioteca potrebbe essere il vostro amico:

    StringUtils.abbreviate("abcdefg", 6) = "abc..."
    StringUtils.abbreviate("abcdefg", 7) = "abcdefg"
    StringUtils.abbreviate("abcdefg", 8) = "abcdefg"
    StringUtils.abbreviate("abcdefg", 4) = "a..."
    • Potrebbe anche essere, ma l’OP la domanda non chiede “puntini di sospensione”.
    • La domanda 8 caratteri, seguiti da 2 punti, dato un limite di lunghezza di 10, che è un po ‘ come i puntini di sospensione (solo 2 punti anziché 3). La sua è anche probabile che molti di coloro che trovano questa domanda sarebbe considerare i puntini di sospensione per essere utile.
    • …e se non vuoi che i puntini di sospensione, quindi StringUtils.a sinistra() può aiutare.
    • Cordiali saluti, ORIZZONTALE PUNTINI di sospensione è un singolo carattere, e non tre, STOP caratteri: …
  3. 41

    C’è un StringUtils funzione che fa questo.

    s = StringUtils.left(s, 10)

    Se len caratteri non sono disponibili, o la Stringa è null, la Stringa verrà restituito senza eccezione. Viene restituita una Stringa vuota se len è negativo.

    StringUtils.a sinistra(null, ) = null

    StringUtils.a sinistra(
    , -ve) = “”

    StringUtils.a sinistra(“”, *) = “”

    StringUtils.(“abc”, 0) = “”

    StringUtils.(“abc”, 2) = “ab”

    StringUtils.(“abc”, 4) = “abc”

    StringUtils.A Sinistra Javadoc

    Cortesia:Steeve McCauley

  4. 16

    Come al solito nessuno si preoccupa UTF-16 coppie di surrogati. Vedere su di loro: Quali sono le più comuni non BMP caratteri Unicode in uso? Anche gli autori di org.apache.commons commons-lang3

    Si può vedere la differenza tra il codice corretto e al solito il codice in questo esempio:

    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)));
        }
    }
  5. 10

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

    • Il secondo parametro della funzione substring è esclusiva, quindi questa risposta finiture Stringa di 9 caratteri.
  6. 6

    O si può semplicemente utilizzare questo metodo nel caso in cui non avete StringUtils a portata di mano:

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

    Solo nel caso in cui siete alla ricerca di un modo per tagliare e tenere gli ULTIMI 10 caratteri di una stringa.

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

    Con Kotlin è molto semplice:

    yourString.take(10)

    Restituisce una stringa contenente i primi n caratteri da questa stringa, o l’intera stringa se la stringa è più corta.

    Documentazione

  9. 0
    str==null ? str : str.substring(0, Math.min(str.length(), 10))

    o,

    str==null ? "" : str.substring(0, Math.min(str.length(), 10))

    Funziona con null.

  10. 0

    tl;dr

    Ti sembra di chiedere un i puntini di sospensione () personaggio in ultimo luogo, quando il troncamento. Qui è un one-liner per manipolare la vostra stringa di input.

    String input = "abcdefghijkl";
    String output = ( input.length () > 10 ) ? input.substring ( 0 , 10 - 1 ).concat ( "…" ) : input;

    Vedere questo codice eseguito dal vivo a IdeOne.com.

    abcdefghi…

    Operatore ternario

    Siamo in grado di fare un one-liner utilizzando il operatore ternario.

    String input = "abcdefghijkl" ;
    
    String output = 
        ( input.length() > 10 )          //If too long…
        ?                                
        input     
        .substring( 0 , 10 - 1 )         //Take just the first part, adjusting by 1 to replace that last character with an ellipsis.
        .concat( "…" )                   //Add the ellipsis character.
        :                                //Or, if not too long…
        input                            //Just return original string.
    ;

    Vedere questo codice eseguito dal vivo a IdeOne.com.

    abcdefghi…

    Java flussi

    Java Flussi di struttura rende questo interessante, come di Java 9 e versioni successive. Interessante, ma forse non è l’approccio migliore.

    Usiamo punti di codice piuttosto che char valori. Il char è di tipo legacy, ed è limitata al un sottoinsieme di tutti i possibili Unicode caratteri.

    String input = "abcdefghijkl" ;
    int limit = 10 ;
    String output =
            input
                    .codePoints()
                    .limit( limit )
                    .collect(                                    //Collect the results of processing each code point.
                            StringBuilder::new,                  //Supplier<R> supplier
                            StringBuilder::appendCodePoint,      //ObjIntConsumer<R> accumulator
                            StringBuilder::append                //BiConsumer<R,​R> combiner
                    )
                    .toString()
            ;

    Se abbiamo avuto i caratteri in eccesso troncato, sostituire l’ultimo carattere con un i puntini di sospensione.

    if ( input.length () > limit )
    {
        output = output.substring ( 0 , output.length () - 1 ) + "…";
    }

    Se solo riuscissi a pensare a un modo per mettere insieme il flusso linea con il “se oltre il limite, fare i puntini di sospensione” di parte.

    • No. Chiaramente, vuole tagliare la lunghezza della stringa, se raggiunge una lunghezza di 11 o più. È necessario essere al lavoro su un nuovo sistema di IA o.O
    • Il tuo commento mi sfugge. Il troncamento di una lunghezza di 10 tra i puntini di sospensione è esattamente quello che ho qui.

Lascia un commento