Я хочу обрізати рядок, якщо довжина перевищує 10 символів.
Припустимо, якщо довжина рядка дорівнює 12 ( String s="abcdafghijkl"), то нова обрізана рядок буде містити "abcdefgh..".
Як я можу цього досягти?
Я хочу обрізати рядок, якщо довжина перевищує 10 символів.
Припустимо, якщо довжина рядка дорівнює 12 ( String s="abcdafghijkl"), то нова обрізана рядок буде містити "abcdefgh..".
Як я можу цього досягти?
Відповіді:
s = s.substring(0, Math.min(s.length(), 10));
Використання Math.minподібного дозволяє уникнути виключення у випадку, коли рядок вже коротший, ніж 10.
Примітки:
Сказане робить справжню обрізку. Якщо ви дійсно хочете замінити останні три (!) Символи крапками, якщо вони скорочуються, тоді використовуйте Apache Commons StringUtils.abbreviate.
Це може поводитись неправильно 1, якщо ваша рядка містить кодові точки Unicode поза BMP; наприклад, Emojis. Для (складнішого) рішення , яке працює правильно для всіх Unicode кодових точок, см @ sibnick - й рішення .
1 - Кодова точка Unicode, яка не знаходиться на площині 0 (BMP), представлена у параметрі "сурогатної пари" (тобто двох charзначень) String. Ігноруючи це, ми можемо зменшити менше 10 кодових очок або (ще гірше) усікати в середині сурогатної пари. З іншого боку, String.length()це вже не ідеальна міра довжини тексту Unicode, тому обрізка на його основі може бути неправильною.
s = (s.length() > 10) ? s.substring(0,10) : s ;
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..."
Commons Lang3 навіть дозволяє встановити спеціальний рядок як маркер заміни. За допомогою цього ви можете, наприклад, встановити еліпсис з одним символом.
StringUtils.abbreviate("abcdefg", "\u2026", 6) = "abcde…"
Є функція Apache Commons, StringUtilsяка робить це.
s = StringUtils.left(s, 10)
Якщо символи len недоступні або String є нульовим, String буде повернуто без винятку. Порожня рядок повертається, якщо len від'ємний.
StringUtils.left (null, ) = null
StringUtils.left ( , -ve ) = ""
StringUtils.left ("", *) = ""
StringUtils.left ("abc", 0) = ""
StringUtils.left (" abc ", 2) =" ab "
StringUtils.left (" abc ", 4) =" abc "
Люб’язно: Стів МакКоулі
Як завжди, ніхто не піклується про сурогатні пари UTF-16. Подивіться про них: Які найпоширеніші символи Unicode, що не належать до BMP, фактично використовуються? Навіть автори 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));
З Котліном це так просто, як:
yourString.take(10)
Повертає рядок, що містить перші n символів з цього рядка, або весь рядок, якщо цей рядок коротший.
Ви, здається, запитуєте символ еліпсису ( …) в останньому місці під час обрізання. Ось однолінійний маніпулятор для введення рядка.
String input = "abcdefghijkl";
String output = ( input.length () > 10 ) ? input.substring ( 0 , 10 - 1 ).concat ( "…" ) : input;
Дивіться цей код, який працює на веб-сайті IdeOne.com.
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.
;
Дивіться цей код, який працює на веб-сайті IdeOne.com.
abcdefghi…
Засіб Java Streams робить це цікавим, як для Java 9 та новіших версій. Цікавий, але, можливо, не найкращий підхід.
Ми використовуємо кодові точки, а не 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 ) + "…";
}
Якби тільки я міг придумати спосіб зібрати рядок потоку з частиною "якщо перевищити ліміт, зробіть еліпсис".