如果长度超过10个字符,我想修剪一个字符串.
假设字符串长度为12(String s="abcdafghijkl"),则新剪裁的字符串将包含"abcdefgh..".
我怎样才能做到这一点?
Ste*_*n C 234
s = s.substring(0, Math.min(s.length(), 10));
Run Code Online (Sandbox Code Playgroud)
使用Math.min这样可以避免在字符串已经短于的情况下出现异常10.
笔记:
以上做了真正的修剪.如果你真的想在截断时用点替换最后三个(!)字符,那么使用Apache Commons StringUtils.abbreviate.
如果您的String包含BMP之外的Unicode代码点,则行为可能不正确1 ; 例如Emojis.对于适用于所有Unicode代码点的(更复杂的)解决方案,请参阅@ sibnick的解决方案.
1 - 不在平面0(BMP)上的Unicode代码点表示为"代理对"(即两个char值)String.通过忽略这一点,我们可能会修剪到少于10个代码点,或者(更糟糕的是)在代理对中间截断.另一方面,String.length()不再是Unicode文本长度的理想度量,因此基于它的修剪可能是错误的.
H6.*_*H6. 116
StringUtils.abbreviate来自Apache Commons Lang库可能是你的朋友:
StringUtils.abbreviate("abcdefg", 6) = "abc..."
StringUtils.abbreviate("abcdefg", 7) = "abcdefg"
StringUtils.abbreviate("abcdefg", 8) = "abcdefg"
StringUtils.abbreviate("abcdefg", 4) = "a..."
Run Code Online (Sandbox Code Playgroud)
Mul*_*lki 42
有一个StringUtils功能可以做到这一点.
s = StringUtils.left(s, 10)
Run Code Online (Sandbox Code Playgroud)
如果len字符不可用,或者String为null,则返回String而不会发生异常.如果len为负,则返回空字符串.
StringUtils.left(NULL,)=空
StringUtils.left(,-ve)= ""
StringUtils.left( "",*)= ""
StringUtils.left( "ABC",0)= ""
StringUtils.left(" abc",2)="ab"
StringUtils.left("abc",4)="abc"
礼貌:Steeve McCauley
sib*_*ick 18
像往常一样,没有人关心UTF-16代理对.了解它们:实际使用中最常见的非BMP Unicode字符是什么?甚至是org.apache.commons/commons-lang3的作者
您可以在此示例中看到正确代码与常用代码之间的区别:
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)));
}
}
Run Code Online (Sandbox Code Playgroud)
shi*_*t66 10
s = s.length() > 10 ? s.substring(0, 9) : s;
小智 7
或者你可以使用这个方法,以防你手头没有StringUtils:
public static String abbreviateString(String input, int maxLength) {
if (input.length() <= maxLength)
return input;
else
return input.substring(0, maxLength-2) + "..";
}
Run Code Online (Sandbox Code Playgroud)
以防万一您正在寻找一种方法来修剪并保留字符串的最后 10 个字符。
s = s.substring(Math.max(s.length(),10) - 10);
Run Code Online (Sandbox Code Playgroud)
这个问题是在 Java 上提出的,但那是 2014 年的事了。
如果你现在使用 Kotlin,它很简单:
yourString.take(10)
Run Code Online (Sandbox Code Playgroud)
返回包含该字符串的前 n 个字符的字符串,如果该字符串较短,则返回整个字符串。
您似乎要求省略号(\xe2\x80\xa6在最后一个地方这是一个用于操作输入字符串的单行代码。
String input = "abcdefghijkl";\nString output = ( input.length () > 10 ) ? input.substring ( 0 , 10 - 1 ).concat ( "\xe2\x80\xa6" ) : input;\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n\n\nabcdefghi\xe2\x80\xa6
\n
我们可以使用三元运算符制作一行。
\n\nString input = "abcdefghijkl" ;\n\nString output = \n ( input.length() > 10 ) // If too long\xe2\x80\xa6\n ? \n input \n .substring( 0 , 10 - 1 ) // Take just the first part, adjusting by 1 to replace that last character with an ellipsis.\n .concat( "\xe2\x80\xa6" ) // Add the ellipsis character.\n : // Or, if not too long\xe2\x80\xa6\n input // Just return original string.\n;\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n\n\nabcdefghi\xe2\x80\xa6
\n
从 Java 9 及更高版本开始,Java Streams 工具使这变得有趣。有趣,但也许不是最好的方法。
\n\n我们使用代码点而不是char值。该char类型是遗留类型,并且仅限于所有可能的Unicode 的子集。
String input = "abcdefghijkl" ;\nint limit = 10 ;\nString output =\n input\n .codePoints()\n .limit( limit )\n .collect( // Collect the results of processing each code point.\n StringBuilder::new, // Supplier<R> supplier\n StringBuilder::appendCodePoint, // ObjIntConsumer<R> accumulator\n StringBuilder::append // BiConsumer<R,\xe2\x80\x8bR> combiner\n )\n .toString()\n ;\nRun Code Online (Sandbox Code Playgroud)\n\n如果我们截断了多余的字符,请用省略号替换最后一个字符 。
\n\nif ( input.length () > limit )\n{\n output = output.substring ( 0 , output.length () - 1 ) + "\xe2\x80\xa6";\n}\nRun Code Online (Sandbox Code Playgroud)\n\n如果我能想出一种方法将流线与“如果超过限制,则省略”部分放在一起就好了。
\n