Java字符串,从右侧开始,每8个字符后插入一个短划线

时间:2012-08-15 17:38:53

标签: java string

从右边开始,在Java字符串中每8个字符后插入-(短划线/减号字符)的最佳方法是什么?

示例:

1111 -> 1111
111111111 -> 1-11111111
1111111111111111 -> 11111111-11111111
100001111111111111111 -> 10000-11111111-11111111

我的尝试,表明我自己尝试过这样做(下面的评论问道:“这是这个功课吗?”:

import junit.framework.TestCase;
public class InsertCharacterAfterEveryNCharacters extends TestCase {
  public static String insertSpacerAfterNCharactersFromTheRight(char spacer,
      int spacing, String string) {
    final int length = string.length();
    final int newStringCapacity = length + (int) Math.ceil(length / (double) spacing);
    StringBuilder stringBuilder = new StringBuilder(newStringCapacity);
    for (int i = length - 1; i >= 0; i--) {
      stringBuilder.append(string.charAt(i));
      if (i % spacing == 0 && i > 0) {
        stringBuilder.append(spacer);
      }
    }
    return stringBuilder.toString();
  }
  public static void testInsertSpacerAfterNCharactersFromTheRight() {
    assertEquals("", insertSpacerAfterNCharactersFromTheRight('-', 8, ""));
    assertEquals("1", insertSpacerAfterNCharactersFromTheRight('-', 8, "1"));
    assertEquals("11", insertSpacerAfterNCharactersFromTheRight('-', 8, "11"));
    assertEquals("11111111",
        insertSpacerAfterNCharactersFromTheRight('-', 8, "11111111"));
    assertEquals("1-11111111",
        insertSpacerAfterNCharactersFromTheRight('-', 8, "111111111"));
    assertEquals("11111111-11111111",
        insertSpacerAfterNCharactersFromTheRight('-', 8, "1111111111111111"));
  }
}

5 个答案:

答案 0 :(得分:28)

所有答案似乎都需要做很多代码。您可以使用正则表达式来执行此操作。

假设您有一个返回格式化字符串的方法。

一个简单明了的例子:

String myString = "00000000000111111111111100000000001111111000011000000";
String newString = myString.replaceAll("(.{8})(?!$)", "$1-");
return newString;

以上等于以下较短的符号:

return myString.replaceAll("(.{8})(?!$)", "$1-");

另一个类似的简短符号(如果是固定的,硬编码的字符串):

return "00000000000111111111111100000000001111111000011000000".replaceAll("(.{8})(?!$)", "$1-");

每段代码都会重新生成以下字符串:

00000000-00011111-11111111-00000000-00111111-10000110-00000

有关正则表达式的更多信息,请参阅示例http://www.regular-expressions.info/java.html

希望这有助于将来的任何人。

编辑说明: 最后一组没有8个字符。但是,如果愿意的话,它不会添加另一个破折号。

答案 1 :(得分:16)

从原始char[]

中构建String
String str = "100001111111111111111";

// add enough space for an additional "-" for every 8 chars:
char[] chars = new char[str.length() + (str.length() / 8)];

// this offset will give us the first "-" position from the LEFT:
int offset = str.length() % 8;
int idx = 0, strIdx = 0;

for (; strIdx < str.length(); idx++, strIdx++)
{
    if (((strIdx % 8) == offset) && (strIdx != 0))
        chars[idx++] = '-';
    chars[idx] = str.charAt(strIdx);
}

String str2 = new String(chars);

System.out.println(str2);

或者您可以使用StringBuilder,这可能涉及(length / 8)数组复制操作:

StringBuilder str = new StringBuilder("100001111111111111111");
int idx = str.length() - 8;

while (idx > 0)
{
    str.insert(idx, "-");
    idx = idx - 8;
}

System.out.println(str.toString());

两种情况下的输出:

  

10000-11111111-11111111

请注意,这不会在索引0处插入连字符,如果需要,您需要调整代码。

答案 2 :(得分:1)

上述解决方案很好,但非常复杂而且很长,我写了这个,它适用于您的输入。

public static String insertCharacterForEveryNDistanceFromRight(int distance, String original, char c){
    StringBuilder sb = new StringBuilder();
    char[] charArrayOfOriginal = original.toCharArray();
    for(int ch = charArrayOfOriginal.length ; ch > 0 ; ch--){
        if(ch % distance == 0 && ch != charArrayOfOriginal.length)
            sb.append(c).append(charArrayOfOriginal[charArrayOfOriginal.length - ch]);
        else
            sb.append(charArrayOfOriginal[charArrayOfOriginal.length - ch]);
    }
    return sb.toString();
}

并称之为......

String rightResult = InsertSpaces.insertCharacterForEveryNDistanceFromRight(8, "100001111111111111111", '-');
System.out.println(rightResult);

答案 3 :(得分:0)

您不能在现有Java String中插入-,因为String是不可变的。但是,您可以创建符合输出格式要求的新String实例。

从输入字符串的结束索引循环到0.对于每次迭代:

  • 将当前索引处的值插入StringBuilder实例的开头。
  • 使用模数运算符查看是否插入了8个字符的倍数。如果是这样,请插入破折号。

如果需要,使用StringBuilder实例的“toString()”方法来获取字符串。

答案 4 :(得分:0)

或许这样的事情?

for(int i = s.length() - 1; i > 0; i -= 8)
{
    s = new StringBuffer(s).insert(i, "-").toString();
    i--;
}