Trim a string based on the string length

后端 未结 12 796
無奈伤痛
無奈伤痛 2020-12-12 14:29

I want to trim a string if the length exceeds 10 characters.

Suppose if the string length is 12 (String s=\"abcdafghijkl\"), then the new trimmed string

相关标签:
12条回答
  • 2020-12-12 15:13

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

    0 讨论(0)
  • 2020-12-12 15:16

    tl;dr

    You seem to be asking for an ellipsis () character in the last place, when truncating. Here is a one-liner to manipulate your input string.

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

    See this code run live at IdeOne.com.

    abcdefghi…

    Ternary operator

    We can make a one-liner by using the ternary operator.

    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.
    ;
    

    See this code run live at IdeOne.com.

    abcdefghi…

    Java streams

    The Java Streams facility makes this interesting, as of Java 9 and later. Interesting, but maybe not the best approach.

    We use code points rather than char values. The char type is legacy, and is limited to the a subset of all possible Unicode characters.

    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()
            ;
    

    If we had excess characters truncated, replace the last character with an ellipsis.

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

    If only I could think of a way to put together the stream line with the "if over limit, do ellipsis" part.

    0 讨论(0)
  • 2020-12-12 15:21

    // this is how you shorten the length of the string with .. // add following method to your class

    private String abbreviate(String s){
      if(s.length() <= 10) return s;
      return s.substring(0, 8) + ".." ;
    }
    
    0 讨论(0)
  • 2020-12-12 15:22
    s = s.substring(0, Math.min(s.length(), 10));
    

    Using Math.min like this avoids an exception in the case where the string is already shorter than 10.


    Notes:

    1. The above does real trimming. If you actually want to replace the last three (!) characters with dots if it truncates, then use Apache Commons StringUtils.abbreviate.

    2. For typical implementations of String, s.substring(0, s.length()) will return s rather than allocating a new String.

    3. This may behave incorrectly1 if your String contains Unicode codepoints outside of the BMP; e.g. Emojis. For a (more complicated) solution that works correctly for all Unicode code-points, see @sibnick's solution.


    1 - A Unicode codepoint that is not on plane 0 (the BMP) is represented as a "surrogate pair" (i.e. two char values) in the String. By ignoring this, we might trim to fewer than 10 code points, or (worse) truncate in the middle of a surrogate pair. On the other hand, String.length() is no longer an ideal measure of Unicode text length, so trimming based on it may be the wrong thing to do.

    0 讨论(0)
  • 2020-12-12 15:23
    str==null ? str : str.substring(0, Math.min(str.length(), 10))
    

    or,

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

    Works with null.

    0 讨论(0)
  • 2020-12-12 15:26

    With Kotlin it is as simple as:

    yourString.take(10)
    

    Returns a string containing the first n characters from this string, or the entire string if this string is shorter.

    Documentation

    0 讨论(0)
提交回复
热议问题