我想要在字符串长度超过10个字符时对其进行裁剪。
假设字符串长度为12(
我该如何实现这个功能?
假设字符串长度为12(
String s="abcdafghijkl"
),那么新的裁剪后的字符串将包含"abcdefgh.."
。我该如何实现这个功能?
s = s.substring(0, Math.min(s.length(), 10));
使用像这样的Math.min
可以避免在字符串已经短于10
的情况下出现异常。 注意:以上代码只是简单地修剪了字符串。如果您想在字符串太长时用三个点替换最后的字符,请使用Apache Commons StringUtils.abbreviate
; 参见@H6的解答。如果您想使用Unicode水平省略号字符,请参见@Basil的解答。对于典型的String
实现,s.substring(0, s.length())
将返回s
而不是分配一个新的String
。 如果您的字符串包含超出BMP范围的Unicode代码点(例如表情符号),那么此操作可能会导致错误行为1。有一个(更复杂的)解决方案可以正确处理所有Unicode代码点,请参见@sibnick的解答。 请注意:String.length()
不是Unicode文本长度的好指标,因此基于该属性进行修剪可能是错误的做法。1s = (s.length() > 10) ? s.substring(0,10) : s ;
- rramStringUtils.abbreviate
来自Apache Commons Lang 库,可能是您的好帮手:
StringUtils.abbreviate("abcdefg", 6) = "abc..."
StringUtils.abbreviate("abcdefg", 7) = "abcdefg"
StringUtils.abbreviate("abcdefg", 8) = "abcdefg"
StringUtils.abbreviate("abcdefg", 4) = "a..."
Commons Lang3 允许设置自定义字符串作为替换标记。这样,您可以设置一个单个字符的省略号。
StringUtils.abbreviate("abcdefg", "\u2026", 6) = "abcde…"
StringUtils
函数可以实现此功能。s = StringUtils.left(s, 10)
像往常一样,没人关心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)));
}
}
或者,如果您手头没有StringUtils,可以使用此方法:
public static String abbreviateString(String input, int maxLength) {
if (input.length() <= maxLength)
return input;
else
return input.substring(0, maxLength-2) + "..";
}
System.out.println(abbreviateString("ABC\ud83d\udc3bDEF", 6));
。 - T3rm1s = s.length() > 10 ? s.substring(0, 9) : s;
这个问题是关于Java的,但是回答是在2014年提出的。
如果你现在使用Kotlin,那么它就非常简单了:
Original Answer翻译成"最初的回答"
yourString.take(10)
你似乎在最后一个位置截断时需要一个省略号(ellipsis)(…
)字符。这里有一个一行代码来操作你的输入字符串。
String input = "abcdefghijkl";
String output = ( input.length () > 10 ) ? input.substring ( 0 , 10 - 1 ).concat ( "…" ) : input;
abcdefghi…
我们可以使用三元运算符来制作一行代码。
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.
;
abcdefghi…
自Java 9及以后,Java流工具变得更加有趣。但是,这可能不是最佳方法。
我们使用代码点而不是char
值。 char
类型已经过时,并且仅限于Unicode字符的子集中的一部分。
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 ( input.length () > limit )
{
output = output.substring ( 0 , output.length () - 1 ) + "…";
}
如果您正在寻找一种方法来截取并保留字符串的最后10个字符,以下是一个示例:
s = s.substring(Math.max(s.length(),10) - 10);
s = s.length() > 10 ? s.substring(0, 10 - 2).concat("..") : s;
但使用“一行”if语句可能会更简单:
if (s.length() > 10) s = s.substring(0, 10 - 2) + "..";