【问题标题】: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);

标签: java string substring


【解决方案1】:

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

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

会产生

'abc' '  a'

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

【讨论】:

【解决方案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】:

    【讨论】:

    • 更简单:使用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");
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-13
        • 1970-01-01
        • 1970-01-01
        • 2012-12-04
        • 2019-01-10
        相关资源
        最近更新 更多