我假设这是一个很容易回答的问题,我如何分割数字20120101,例如,使用java中的split()方法来获取2012年,01,01 ...我会知道怎么做如果用逗号或句号分隔,但是当它没有被任何东西分开时你怎么做呢?
答案 0 :(得分:5)
如何使用split()分割数字20120101 java中获取2012,01,01 ...
的方法
你不会; split
通常用于带有明确分隔符的文本,这些分隔符不属于你的(你可以看到其他答案,但它不是这项工作的最佳工具)。你有选择:
使用String.substring
拉出特定位置的子串。例如:
String m = "20120101".substring(4, 6);
使用SimpleDateFormat
来解析日期。例如:
Date d = new SimpleDateFormat("yyyyMMdd").parse("20120101");
使用数学(虽然在语义上并不合适,因为您的输入应该是一个日期)。例如:
int number = Integer.parseInt("20120101");
int y = number / 10000;
int m = (number / 100) % 100;
int d = number % 100;
<小时/> 编辑:
上面的答案是严肃和善意的。下面的答案纯属有趣的废话。
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);
或极其方便的解决方案,使用修改后的StringReader
插入空格,使用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;
我想你也可以编写一个从stdin读取的程序,在适当的位置插入逗号,然后打印结果。然后,您可以将字符串传递给该程序,读取输出(使用Process
)和split()
。如果Process
过于简单,您可以使用类加载器动态加载该程序的类,然后在重定向stdin和stdout后使用反射来调用main
。
答案 1 :(得分:3)
试试这个:
String date = "20120101";
String year = date.substring(0, 4);
String month = date.substring(4, 6);
String day = date.substring(6, 8);
或使用SimpleDateFormat
和Calendar
:
String date = "20120101";
DateFormat df = new SimpleDateFormat("yyyyMMdd");
Calendar cal = Calendar.getInstance();
try {
cal.setTime(df.parse(date));
} catch (ParseException e) {
e.printStackTrace();
// Could not parse date.
// Break execution.
}
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
答案 2 :(得分:2)
正如我在评论中所说,尝试使用split(...)就像尝试使用香蕉作为锤子一样。当然,在某种程度上,你最终可能会把它做成某种工作,但这会很痛苦,结果也不太可靠。使用正确的工具完成工作。
所以这里有一个丑陋的例子,就像h3ll split(...)
一样只是为了笑容而发布:
import java.util.Arrays;
public class DumbSplit {
public static void main(String[] args) {
String dateStr = "20120101";
String bananaAsHammer = "(?<=.{4}).*(?=.{4})|(?<=.{6}).*(?=.{2})";
String[] tokens = dateStr.split(bananaAsHammer);
System.out.println(Arrays.toString(tokens));
}
}