限制字符串中的字符数,并截断其余字符
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() > 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
!不需要if
或ternary ?:
。
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");以上是关于限制字符串中的字符数,并截断其余字符的主要内容,如果未能解决你的问题,请参考以下文章