2014-03-31 11 views
6

Was ist eine elegante Möglichkeit, gängige Formate (z. B. datetime) für string.format in zugängliche Konstanten zu übertragen?DRY-String-Formatierung

Idealerweise möchte ich etwas wie das Folgende machen, aber ich bekomme den untenstehenden Fehler, wenn ich versuche, diesen Code zu verwenden.

var now = DateTime.Now; 
var format = "yyyy-MM-dd"; 
Console.WriteLine(string.Format("The date is {1:{0}}", format, now)); 

[System.FormatException. Eingabezeichenfolge in einem korrekten Format not] bei Program.Main(): Zeile 9

Der Grund hierfür ist, dass bestimmte API erfordert eine spezifisches Datetime-Format. Ich möchte in der Lage sein, einen einzelnen Ort zu referenzieren, um dieses Format zu erhalten, so dass alle oder keine der Anrufe funktionieren.

Ich weiß, dass das Folgende funktioniert, aber es scheint nicht sehr elegant.

Console.WriteLine(string.Format("The date is {1:" + format + "}", format, now)); 
+0

Haben Sie eine begrenzte Liste von Datumsformate Sie unterstützen müssen? –

+0

@YuriyRozhovetskiy vorerst ja, obwohl es einige Zeit dauern würde, alle aufzuzählen. –

Antwort

2

Sie könnten eine App konstanten Weg gehen - eine statische Klasse, die die Saiten Format hält.

namespace App.Framework { 
    public static class AppConstant { 
     public static readonly string DisplayDateShort = "MM/dd/yyyy"; 
    } 
} 

Soweit Ihr Beispiel geht, ist es ein bisschen fehlerhaft; Sie möchten ToString() auf Ihrem DateTime Wert aufrufen.

Console.WriteLine(now.ToString(AppConstant.DisplayDateShort));

+0

Sie schlagen also folgendes vor: 'Console.WriteLine (string.Format (" Das Datum ist {0} ", now.ToString (Format)));', korrekt? –

+0

Ich habe eine 'FormatWith' String-Erweiterung-Methode, die ich verwende, um das Rauschen ein wenig zu reduzieren (' "Das Datum ist {0}". FormatWith (now.ToString (Format)) '), aber ansonsten ja. – 48klocs

2

Sie können alle verwendet Formatstrings unter DateTimeFormatInfo.CurrentInfo.GetAllDateTimePatterns() finden.

Danach können Sie individuell versuchen, Ihre Eingabedaten mit jedem Wert zu analysieren und zu sehen, welche bei der Rückkehr true (siehe: DateTime.TryParseExact()).

Console.WriteLine (DateTimeFormatInfo.CurrentInfo.GetAllDateTimePatterns()); 

enter image description here

Beispielcode:

void Main() 
{ 
    var now = DateTime.Now.ToString(); 

    foreach(var format in DateTimeFormatInfo.CurrentInfo.GetAllDateTimePatterns()){ 
     DateTime result; 
     if(DateTime.TryParseExact(now, format, CultureInfo.CurrentCulture, DateTimeStyles.None, out result)){ 
      Console.WriteLine(string.Format("The date is {0}, the format is: {1}", result, format)); 
     } 
    } 
} 

enter image description here

+0

Vielen Dank für das Teilen, da ich nicht wusste, dass Sie das tun könnten. In meinem speziellen Fall ist die Datetime im richtigen Format. –

1

Sie in Erwägung ziehen könnte das Format in eine Erweiterung Methode drängen, die bei Bedarf verbraucht werden kann, das heißt:

public static class DateExt 
{ 
    public static string FormatAsSomething(this DateTime dt) 
    { 
     string format = "yyyy-MM-dd"; 
     string result = dt.ToString(format); 
     return result; 
    } 
} 

Und dann:

var now = DateTime.Now; 
Console.WriteLine("The date is {0}", now.FormatAsSomething()); 

Jedes Mal, wenn das Format muss Aktualisieren Sie einfach die Erweiterungsmethode.

0

Sie können benutzerdefinierte Format-Provider für DateTime Werte verwenden:

static void Main(string[] args) 
{ 
    var now = DateTime.Now; 

    var str = string.Format(new MyDateFormatter(), "The date is {0}", now); 

    Console.WriteLine(str); 

    MyDateFormatter.DefaultDateFormat = "dd-MM-yyyy HH:mm"; 

    str = string.Format(new MyDateFormatter(), "The date is {0}", now); 

    Console.WriteLine(str); 
} 

public class MyDateFormatter: IFormatProvider, ICustomFormatter 
{ 
    public static string DefaultDateFormat = "yyyy-MM-dd"; 

    public object GetFormat(Type formatType) 
    { 
     if (formatType == typeof(ICustomFormatter)) 
      return this; 

     return null; 
    } 

    public string Format(string format, object arg, IFormatProvider formatProvider) 
    { 
     // Check whether this is an appropriate callback    
     if (!this.Equals(formatProvider)) 
      return null; 

     var argFormat = "{0:" + (arg is DateTime ? DefaultDateFormat : string.Empty) + "}"; 

     return string.Format(argFormat, arg); 
    } 
}