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

Rob*_*ino 7 java string

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

例子:

1111 -> 1111
111111111 -> 1-11111111
1111111111111111 -> 11111111-11111111
100001111111111111111 -> 10000-11111111-11111111
Run Code Online (Sandbox Code Playgroud)

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

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"));
  }
}
Run Code Online (Sandbox Code Playgroud)

ar3*_*34z 30

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

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

一个简单明了的例子:

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

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

return myString.replaceAll("(.{8})(?!$)", "$1-");
Run Code Online (Sandbox Code Playgroud)

另一个类似的简短表示法(​​如果是固定的硬编码字符串):

return "00000000000111111111111100000000001111111000011000000".replaceAll("(.{8})(?!$)", "$1-");
Run Code Online (Sandbox Code Playgroud)

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

00000000-00011111-11111111-00000000-00111111-10000110-00000
Run Code Online (Sandbox Code Playgroud)

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

希望这对未来的任何人都有帮助.

编辑注释:最后一组不包含8个字符.但是,如果可以,它将不会添加另一个破折号.


pb2*_*b2q 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);
Run Code Online (Sandbox Code Playgroud)

或者您可以使用a 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());
Run Code Online (Sandbox Code Playgroud)

两种情况下的输出:

10000-11111111-11111111

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