2013-02-08 22 views
5

Birçok farklı formats olabilir String var. Değerin gerçek tipini runtime'da tanımalı ve sonra bu türe dönüştür. Örneğin,Dizgiyi uygun DataType'a dönüştürme

. Bir StringFri Feb 08 07:30:00 GMT 2013 varsa, bu aslında bir Date ve String bir date object dönüştürülmeli ve böyle bir şekilde döndürülmelidir.

Bu soruna yönelik şu anki çözümüm, bir veri türüne dönüştürmeyi 'denemek', eğer dönüşüm başarılı olursa, tüm bunlar iyi olursa, dönüştürme başarısız olursa, sonraki dönüşüm girişimi devam eder. Bu çalışır, ancak çirkin ve sürdürülemez ve eminim orada daha iyi bir çözüm var.

Teşekkürler.

+0

Bir String'in dönüştürülebileceği olası veri türleri nelerdir? – anubhava

+7

"0" anlamı "Gerçekten, sadece 0 içeren bir dize istiyorum" ve "0" anlamında "tam sayı 0" ve "0" anlamında "çift değer 0" ve "0" anlamını ayırt etmek için nasıl beklersiniz? ondalık değeri 0 "? Değerin yanında uygun tip bilgileri tutmaya çalışabilirseniz * çok daha iyi olurdu. –

+0

bazı örnek dizeleri gösterebilir misiniz? Bu dizeler 'toString()' yönteminin çıktısı mıdır? – Azodious

cevap

0

Düzenli ifade kullanmayı deneyin: Sahip olduğunuz her veri türü için bir model yazabilir ve daha sonra her bir eşleşme için bir dönüşümü ilişkilendirebileceğiniz her bir gerçek dizeyle bu deseni eşleştirebilirsiniz.

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 
} 

Ödeme matchers ilgili daha fazla ayrıntı ve düzenli ifadeler için java belgeleri: 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

Her veri için ayrı normal ifadeyi kullanabilir İşte (sözde Java) basit bir örnek Böyle yazın:

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

örnekleri olmalıdır. Çok zarif, teşekkürler –

0

Sizin dizeleriniz size geçerse, yaklaşımınız iyidir senin kontrolün. Sadece bir öneri: Her olası dönüşümü uygulamalı ve belirsiz dizeleri kontrol etmelisiniz. Birden çok dönüşüm başarılı olursa, dizge belirsizdir ve büyük olasılıkla bir istisna atmak için bazı hata işlemlerini gerçekleştirmeniz gerekir.