【问题标题】:Java - truncate string from left with formatter flagJava - 使用格式化程序标志从左侧截断字符串
【发布时间】:2014-10-27 03:12:55
【问题描述】:

我有一个字符串,比如说:

String s = "0123456789";

我想用格式化程序填充它。我可以通过两种方式做到这一点:

String.format("[%1$15s]", s); //returns [     0123456789]

String.format("[%1$-15s]", s); // returns [0123456789     ]

如果我想截断文本,我会这样做

String.format("[%1$.5s]", s);  // returns [01234]

如果我想从左边截断,我想我可以这样做:

String.format("[%1$-.5s]", s); // throws MissingFormatWidthException

但这失败了,所以我尝试了这个:

String.format("[%1$-0.5s]", s); // throws MissingFormatWidthException

还有这个:

String.format("[%1$.-5s]", s); // throws UnknownFormatConversionException

那么如何使用格式标志从左侧截断?

【问题讨论】:

    标签: java string-formatting


    【解决方案1】:

    我希望这是你需要的:

    System.out.println("'" + String.format("%-5.5s", "") + "'");
    System.out.println("'" + String.format("%-5.5s", "123") + "'");
    System.out.println("'" + String.format("%-5.5s", "12345") + "'");
    System.out.println("'" + String.format("%-5.5s", "1234567890.....") + "'");
    

    输出长度总是5:

    '     ' - 填充 5 个空格
    '123  ' 后填充 2 个空格 '12345' - 等于
    '12345' - 截断

    另外:

    System.out.println("'" + String.format("%5.5s", "123") + "'");
    

    输出:

    '  123' 前面有 2 个空格

    【讨论】:

    • 就截断字符串的右侧部分而言,此答案是正确的,但 OP 想要从左侧截断(不寻常,但这就是他想要的)
    【解决方案2】:

    - 标志是为了证明,似乎与截断没有任何关系。

    . 用于“精确度”,显然转换为字符串参数的截断。

    我认为格式字符串不支持从左侧截断。你必须求助于

    String.format("[%.5s]", s.length() > 5 ? s.substring(s.length()-5) : s);
    

    【讨论】:

    • 是的,我想。我不想诉诸于此的原因是,我为字符串格式构建了一个排序包装器,它允许用户提供一个值 Map 并通过名称而不是索引来引用其中的实体(IE“ %SOMEKEY$s”,而不是“%1$s”)。它需要能够从左侧截断。这只是将值汇集到标准字符串格式化程序中。我找到了一个解决方法,可以使用一些适度的切刀字符串反转和正则表达式,所以一切都很好:D
    • 听起来像一个简洁的实用程序。你看过MessageFormat吗?似乎没有做你想做的事,但也许它比String.format 更接近。
    【解决方案3】:

    你也可以使用方法来操作字符串

    substring(startindex, endIndex)
    

    返回一个字符串对象,该对象开始一个指定的索引,然后转到但不包括结束索引。

    也可以尝试使用StringBuilder类。

    【讨论】:

    • 问题是专门询问如何使用 Formatter 标志。
    • apache commons StringUtils.substring(...) 似乎对我很有效(因为我已经使用了该库)。
    • @VGR,有时最好的答案是那些提出比人们最初希望的更好的做事方式的答案。这绝不是一个糟糕的答案,特别是考虑到接受的答案说“你不能使用 string.format”并建议一个解决方法本身(具有讽刺意味的是,使用 substring 方法)。