2012-09-04 109 views
3

我想知道是否有任何好方法如何從Groovy或甚至Java中的格式化字符串中讀取單個屬性。從格式化的字符串中讀取值Java,Groovy

我有一個字符串包含一些由空格分隔的屬性。例如「2.1 20真實」。訂單是固定的,並且「屬性類型」是已知的(例如,第一個是Float,第二個是Integer等)。我需要類似於String.format()的其他方法。

我知道我可以手動拆分字符串和讀取的值,但是這使得代碼太複雜這樣的:

String[] parsedText = "2.1 20 Something true".split(delimiter) 

try { 
    firstVal = new Float(parsedText[0]) 
} 
catch (NumberFormatException e) { 
    throw new RuntimeException("Bad data [0th position in data string], cannot read[{$parsedData[0]}], cannot convert to float") 
} 
... 

有沒有更好的辦法?我很確定,至少在Groovy中是:-)

謝謝!

回答

11

Java Scanner類有一大堆方法用於抓取和分析字符串的下一部分,例如, next()nextInt()nextDouble()

的代碼看起來是這樣的:

String input = "2.1 20 Something true"; 
Scanner s = new Scanner(input); 
float f = s.nextFloat(); 
int i = s.nextInt(); 
String str = s.next(); // next() doesn't parse, you automatically get a string 
boolean b = s.nextBoolean(); 

警惕的唯一的事:next()nextLine()都讓你字符串,但next()只讓你串到下一個空間。如果你想讓你的字符串組件在它們中有空格,你需要解釋它。

2

java.util的掃描器類應該爲您完成這項工作。從輸入中讀取時,需要考慮更多的情況。

就你而言,你可以在一行中調用掃描器方法,或者使用regexp將「格式字符串」明確定義並保存在一個地方。 通過這種方式,您將通過一次驗證受益。

//calling methods in row 
{ 
    Scanner sc = new Scanner("2.1 20 Something true"); 
    float f = sc.nextFloat(); 
    int i = sc.nextInt(); 
    String s = sc.nextLine(); 

    System.out.print(String.format("%s\t%.2f\t%x\n", s, f, i)); 

    sc.close(); 
} 
//using regexp 
{ 
    Scanner sc = new Scanner("2.1 20 Something true"); 
    sc.findInLine("(\\d+[\\.,]?\\d*)\\s(\\d+)(\\s.*)$"); 
    MatchResult result = sc.match(); 
    float f = Float.parseFloat(result.group(1)); 
    int i = Integer.parseInt(result.group(2)); 
    String s = result.group(3); 

    System.out.print(String.format("%s\t%.2f\t%x\n", s, f, i)); 

    sc.close(); 
} 

掃描器類有不同的構造使用的類與類型的對象:文件,InputStream的,可讀的ReadableByteChannel和與字符串發現示例英寸

請注意,這個類是locale感知的,所以它的行爲可能會有所不同,具體取決於系統設置(某些國家使用彗差而不是浮點指向等)。您可以覆蓋區域設置。

這裏是綜合參考:http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html

+0

「真東西」實際上應該是一個字符串,後跟一個布爾值,而不是一個兩個單詞串。 – chm