限制字符串中的字符数,并截断其余字符

Posted

技术标签:

【中文标题】限制字符串中的字符数,并截断其余字符【英文标题】:Limiting the number of characters in a string, and chopping off the rest 【发布时间】:2012-01-12 06:31:59 【问题描述】:

我需要在日志末尾创建一个汇总表,其中包含一些值 在类中获得。表格需要以固定宽度打印 格式。我已经有代码可以做到这一点,但我需要限制字符串, 将双精度和整数转换为在代码中硬编码的固定宽度大小。

所以,假设我想打印一个固定宽度的表格

    int,string,double,string
    int,string,double,string
    int,string,double,string
    int,string,double,string

    and the fixed widths are: 4, 5, 6, 6.

如果一个值超过这个宽度,最后一个字符需要被截掉。所以 例如:

    124891, difference, 22.348, montreal

需要打印的字符串应该是:

    1248 diffe 22.348 montre

我想我需要在构造函数中做一些事情来强制 字符串不超过一定数量的字符。我可能会 将双精度和整数转换为字符串,因此我可以强制执行最大宽度 要求。

我不知道这是用哪种方法,或者是否可以将字符串实例化为 举止得体。使用格式化程序仅有助于 用于打印字符串的固定格式,但实际上并没有 砍掉超过最大长度的字符。

【问题讨论】:

if ( ff.length()>7 ) ff = ff.substring(0,7); 【参考方案1】:

您也可以使用String.format("%3.3s", "abcdefgh")。第一个数字是最小长度(如果字符串较短,则将被填充),第二个数字是最大长度,如果较长,字符串将被截断。所以

System.out.printf("'%3.3s' '%3.3s'", "abcdefgh", "a");

会产生

'abc' '  a'

(显然,您可以删除引号)。

【讨论】:

使用String.format(String format, Object... args)作为更常见的方法 获取字符串最后 n 个字符的字符串语法是什么? 不过可能比String::substring(0, max) 慢。【参考方案2】:

用它来切断不需要的字符:

String.substring(0, maxLength); 

例子:

String aString ="123456789";
String cutString = aString.substring(0, 4);
// Output is: "1234" 

为确保在输入字符串小于预期长度时不会收到 IndexOutOfBoundsException,请改为执行以下操作:

int maxLength = (inputString.length() < MAX_CHAR)?inputString.length():MAX_CHAR;
inputString = inputString.substring(0, maxLength);

如果您希望整数和双精度数具有一定的长度,那么我建议您使用NumberFormat 来格式化您的数字,而不是切断它们的字符串表示。

【讨论】:

嗯。如果“Precision”也适用于 String 那就太好了。 我认为inputString.substring(0, Math.min(MAX_CHAR, inputString.length())); 更具可读性。 inputString.substring(0, (inputString.length() &gt; MAX_CHAR) ? MAX_CHAR : inputString.length()) 这个加上JDK 12中引入的String.transform()函数是最好的:)【参考方案3】:

为了可读性,我更喜欢这个:

if (inputString.length() > maxLength) 
    inputString = inputString.substring(0, maxLength);

超过接受的答案。

int maxLength = (inputString.length() < MAX_CHAR)?inputString.length():MAX_CHAR;
inputString = inputString.substring(0, maxLength);

【讨论】:

【参考方案4】:

您可以使用 Apache Commons StringUtils.substring(String str, int start, int end) 静态方法,它也是 null 安全的。

见:http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringUtils.html#substring%28java.lang.String,%20int,%20int%29

和http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/src-html/org/apache/commons/lang/StringUtils.html#line.1961

【讨论】:

更简单:使用left method。 添加库来截断字符串非常过分。此解决方案的注意事项是仅在您已经在使用 commons 时才使用它【参考方案5】:

您可以使用

轻松实现此目的
    shortString = longString.substring(0, Math.min(s.length(), MAX_LENGTH));

【讨论】:

【参考方案6】:

如果您只想要最大长度,请使用StringUtils.left!不需要ifternary ?:

int maxLength = 5;
StringUtils.left(string, maxLength);

输出:

      null -> null
        "" -> ""
       "a" -> "a"
"abcd1234" -> "abcd1"

Left Documentation

【讨论】:

【参考方案7】:

解决办法可能是java.lang.String.format("%" + maxlength + "s", string).trim(),像这样:

int maxlength = 20;
String longString = "Any string you want which length is greather than 'maxlength'";
String shortString = "Anything short";
String resultForLong = java.lang.String.format("%" + maxlength + "s", longString).trim();
String resultForShort = java.lang.String.format("%" + maxlength + "s", shortString).trim();
System.out.println(resultForLong);
System.out.println(resultForShort);

输出:

Any string you want w

Anything short

【讨论】:

使用“%.20s”而不是“%20s”可以避免修剪的需要【参考方案8】:

理想情况下,您应该尽量不要为了创建表而修改内部数据表示。 String.format() 有什么问题?它将返回具有所需宽度的新字符串。

【讨论】:

好吧,也许我用错了。但它实际上并没有改变我的字符串的长度。我使用了格式化程序,但没有任何效果。它确实可以很好地打印内容,但不会更改字符串的长度: Formatter fmt = new Formatter(); // 声明成员的对应格式 String hardCodedFormat = "%5s%5s"; // %20s 字符串 m_Project;字符串名称 = "mynameis";字符串名称2 = "ted123"; fmt.format(hardCodedFormat, name, name2); System.out.println(fmt); @Flethuseo 您应该能够截断字符串。试试这个:System.err.format("%1$.5s", "A long string");

以上是关于限制字符串中的字符数,并截断其余字符的主要内容,如果未能解决你的问题,请参考以下文章

在 JaxB 编组期间将字符串截断到最大限制

文本块上的字符数限制

数据表 - 单元格字符串截断

如何限制输出的最大字符数? [复制]

用 CSS 截断长字符串:可行吗?

用 CSS 截断长字符串:可行吗?