使用split() - java分割未被任何东西分隔的数字

时间:2013-11-04 01:26:11

标签: java split numbers

我假设这是一个很容易回答的问题,我如何分割数字20120101,例如,使用java中的split()方法来获取2012年,01,01 ...我会知道怎么做如果用逗号或句号分隔,但是当它没有被任何东西分开时你怎么做呢?

3 个答案:

答案 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);

或使用SimpleDateFormatCalendar

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));
   }
}