2013-02-08 16 views
5

Stringは多種多様である可能性がありますformatsです。実際の値の型をruntimeに認識し、値をその型に変換する必要があります。文字列を適切なデータ型に変換します

たとえば、 StringFri Feb 08 07:30:00 GMT 2013の場合は、実際にはDateStringdate objectに変換して返す必要があります。

この問題の私の現在の解決策は、データ型に変換するために「試行」することです。変換が成功するとすべてが良好で、変換が失敗した場合は次の変換の試行に移ります。これはうまくいくものの、醜く保守不能で、より良い解決策がすでに存在していると確信しています。

ありがとうございました。

+0

文字列を変換できるすべてのデータ型は何ですか? – anubhava

+7

"0"は "0"を意味する "0"を意味し、 "0"は "0"を意味する "0"を意味し、 "0"小数値0?値の横に適切な型情報を保持しようとするとよいでしょう。 –

+0

他のいくつかの文字列を表示できますか?これらの文字列は 'toString()'メソッドの出力ですか? – Azodious

答えて

0

正規表現を試してください データタイプごとにパターンを作成し、そのパターンをそれぞれの一致にコンバージョンを関連付けることができる実際の文字列と一致させることができます。マッチャと正規表現の詳細については、Javaドキュメント

String name = "Mike"; // This is an English name 
String nameRegEx ="[A-Z][a-z]+"; //this patterns matches an english name 
Matcher nameMatcher = new Matcher(regEx); 
if (match.matches(name)){// I use the matches() method to verify the format of the string 
    Name nameObject = Converter.getNameObjectFromString(name);//I make the conversion 
} 

チェックアウト:ここ は簡単な例(疑似Javaで)である http://docs.oracle.com/javase/tutorial/essential/regex/

1
public static void main(String[] args) { 

    String s = "Fri Feb 08 07:30:00 GMT 2013"; 
    SimpleDateFormat FT = new SimpleDateFormat("EEE MMM dd hh:mm:ss z yyyy"); 
    Date d; 
    try { 
     d = FT.parse(s); 
     System.out.println(d); 
    } catch (ParseException ex) { 
     Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 
4

あなたは、各データのために別々の正規表現を使用することができます次のように入力してください:

private final static Pattern DATE_PATTERN = 
    Pattern.compile (
     "(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat) " + 
     "(?:Jan|Feb|Mar|Apr|May|June?|July?|Aug|Sept?|Oct|Nov|Dec) " + 
     "\\d\\d \\d\\d:\\d\\d:\\d\\d \\S+ \\d\\d\\d\\d"); 

private final static Pattern DOUBLE_PATTERN = 
    Pattern.compile (
     "[\\+\\-]?\\d+\\.\\d+(?:[eE][\\+\\-]?\\d+)?"); 

private final static Pattern INTEGER_PATTERN = 
    Pattern.compile (
     "[\\+\\-]?\\d+"); 

public static Object stringToObject (String string) 
{ 
    if (DATE_PATTERN.matcher (string).matches()) 
     return stringToDate (string); 
    else if (DOUBLE_PATTERN.matcher (string).matches()) 
     return Double.valueOf (string); 
    else if (INTEGER_PATTERN.matcher (string).matches()) 
     return Integer.valueOf (string); 
    else return string; 
} 
+0

非常にエレガントな、ありがとう –

0

あなたに渡された文字列がoあなたのコントロールのut。もう1つの提案:考えられるすべての変換を適用し、あいまいな文字列をチェックする必要があります。複数の変換が成功した場合、文字列はあいまいで、おそらく例外をスローしてエラー処理を行う必要があります。

関連する問題