Mar*_*idi 2 java split numbers
我假设这是一个很容易回答的问题,我如何拆分数字20120101,例如,使用java中的split()方法来获取2012年,01,01 ...如果是的话,我会知道怎么做用逗号或句号分隔,但是当它没有被任何东西分开时你怎么做?
例如,如何使用java中的split()方法分割数字20120101以获得2012,01,01 ...
你不会; split通常用于带有明确分隔符的文本,这些分隔符不属于你的(你可以看到其他答案,但它不是这项工作的最佳工具).你有选择:
使用String.substring在特定的位置拉出子.例如:
String m = "20120101".substring(4, 6);
Run Code Online (Sandbox Code Playgroud)使用a SimpleDateFormat来解析日期.例如:
Date d = new SimpleDateFormat("yyyyMMdd").parse("20120101");
Run Code Online (Sandbox Code Playgroud)使用数学(虽然在语义上不太合适,因为你的输入应该是一个日期).例如:
int number = Integer.parseInt("20120101");
int y = number / 10000;
int m = (number / 100) % 100;
int d = number % 100;
Run Code Online (Sandbox Code Playgroud)上面的答案是严肃和善意的.下面的答案纯粹是有趣的废话.
Hovercraft Full Of Eels展示了如何使用正则表达式split().
有点偏离主题,这里有一些其他完全不合适和丑陋的解决方案,没有真正的原因(我不打算发布正则表达式,除非我想出一个特别令人讨厌的解决方案):
使用StringReader:
StringReader reader = new StringReader("20120101");
String y, m, d;
char buffer[];
buffer = new char[4];
reader.read(buffer);
y = new String(buffer);
buffer = new char[2];
reader.read(buffer);
m = new String(buffer);
reader.read(buffer);
d = new String(buffer);
Run Code Online (Sandbox Code Playgroud)
或者是一个非常方便的解决方案,使用修改StringReader后的插入空格和a StreamTokenizer来分割标记:
StreamTokenizer st = new StreamTokenizer(new StringReader("20120101") {
private int position = 0;
@Override public int read () throws IOException {
switch (++ position) {
case 5:
case 8:
return ' ';
default:
return super.read();
}
}
@Override public int read (char[] cbuf, int off, int len) throws IOException {
for (int n = off; n < off + len; ++ n)
cbuf[n] = (char)read();
return len;
}
@Override public boolean markSupported () {
return false;
}
@Override public void reset () throws IOException {
position = 0;
super.reset();
}
});
st.resetSyntax();
st.wordChars('0', '9');
st.whitespaceChars(' ', ' ');
st.nextToken();
String y = st.sval;
st.nextToken();
String m = st.sval;
st.nextToken();
String d = st.sval;
Run Code Online (Sandbox Code Playgroud)
我想你也可以编写一个从stdin读取的程序,在适当的位置插入逗号,然后打印结果.然后,您可以将字符串传递给该程序,读取输出(使用Process),然后split().如果Process过于简单,可以使用类加载器动态加载该程序的类,然后使用反射main在相应地重定向stdin和stdout后调用.
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |