文字数が10文字を超える場合、文字列をトリミングしたい。
文字列の長さが12(String s="abcdafghijkl"
)の場合、新しいトリミングされた文字列にはが含まれると仮定します"abcdefgh.."
。
どうすればこれを達成できますか?
文字数が10文字を超える場合、文字列をトリミングしたい。
文字列の長さが12(String s="abcdafghijkl"
)の場合、新しいトリミングされた文字列にはが含まれると仮定します"abcdefgh.."
。
どうすればこれを達成できますか?
回答:
s = s.substring(0, Math.min(s.length(), 10));
このMath.min
ように使用することで、文字列がすでにより短い場合の例外を回避できます10
。
ノート:
上記は実際のトリミングを行います。最後の3文字(!)を切り捨ててドットに置き換える場合は、Apache Commonsを使用してくださいStringUtils.abbreviate
。
これが正しく動作する1を、あなたの文字列が外BMPのUnicodeのコードポイントが含まれている場合は、例:絵文字。すべてのUnicodeコードポイントで正しく機能する(より複雑な)ソリューションについては、@ sibnickのソリューションを参照してください。
1-プレーン0にないUnicodeコードポイント(BMP)は、「サロゲートペア」(つまり2つの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文字が使用できない場合、または文字列がnullの場合、文字列は例外なく返されます。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サロゲートペアを気にしません。それらについて見てください:実際に使用されている最も一般的な非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)));
}
}
s = s.length() > 10 ? s.substring(0, 9) : s;
または、手元に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));
切り捨てるとき、最後の場所に省略記号(…
)文字を要求しているようです。これは、入力文字列を操作するためのワンライナーです。
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 9以降では、Java Streams機能がこれを興味深いものにしています。興味深いですが、最善の方法ではないかもしれません。
値ではなくコードポイントを使用しchar
ます。char
タイプは遺産である、とに限定されるのA部分集合可能なすべての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 ) + "…";
}
流線を「制限を超えている場合は省略」の部分と組み合わせる方法を考えることができたとしたら。