2013-11-04 37 views
2

我假設這是一個容易回答的問題,我將如何拆分一個數字20120101,例如,使用java中的split()方法獲取2012年, 01,01 ...如果它被逗號或句點分開,我會知道該怎麼做,但是如果它沒有被任何東西隔開,你怎麼做?拆分使用split()分離的任何數據都沒有分開 - java

+0

爲什麼不使用串? –

+3

根據你的例子,你可以使用'SimpleDateFormat'生成一個'Date'對象並以這種方式提取這些值。 – MadProgrammer

+1

嘗試爲此使用'split(...)'就像嘗試使用香蕉作爲錘子一樣。當然,在某種程度上,你最終可能會從事某種工作,但這會很痛苦,結果也不是很可靠。使用正確的工具來完成這項工作。 –

回答

5

我將如何分割數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; 
    


編輯:

以上答案是嚴重的,善意的。下面的答案純粹是有趣的廢話。

氣墊船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; 

我想你也可以編寫一個程序,從標準輸入讀取,在適當的地方插入逗號,然後打印結果。然後,您可以將您的字符串輸入該程序,讀取輸出(使用Process)和split()即可。如果Process太直接了,那麼可以用類加載器動態加載該程序的類,然後使用反射來相應地重定向stdin和stdout後調用main

+0

我最終使用了子字符串,謝謝! –

+0

爲什麼會更好?但我同意,似乎破碎了。 –

+0

不,從不使用醜陋的正則表達式時,一個體面的可調試和可擴展的解決方案存在。 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); 
+0

這工作得很好,謝謝!而不是把它放到一個字符串中,我立即將它解析爲一個整數。 –

+0

你把它解析爲一個整數?你測試過其中一個細分市場是08還是09?那裏可能有問題。 –

+0

我不知道它會如何產生問題??只要它的格式爲20120101我不知道它會如何導致問題 –

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

我也在研究這個。然後我停了下來,因爲肯定會有比我更有奉獻精神的人解決這個問題。瞧瞧... –

+0

@JasonC:我確信有更好的和更醜陋的解決方案。所以是的,繼續分享,如果你有。 –

+0

哦jeez,我從來沒有得到這個,謝謝你給我這個! haha –