2009-09-18 10 views
30

Ho una variabile DateTime?, a volte il valore è null, come posso restituire una stringa vuota "" quando il valore è null o il DateTime valore quando non null?C# Nullable <DateTime> a stringa

risposta

32
string date = myVariable.HasValue ? myVariable.Value.ToString() : string.Empty;
+0

Grazie, esattamente quello che stavo cercando –

+11

Cosa !? Puoi semplicemente chiamare .ToString() nell'istanza Nullable per ottenere String.Empty. Anche Eric Lippert (che potrebbe aver persino implementato questo comportamento) lo nota. _Quale_ dovrebbe essere la risposta accettata. – codekaizen

+1

@codekaizen - Ricevo un'eccezione quando provo a farlo. Quindi no, non sarebbe la risposta accettata. Forse questo non è un problema nelle versioni più recenti di C# o .net? –

1
DateTime? MyNullableDT; 
.... 
if (MyNullableDT.HasValue) 
{ 
    return MyNullableDT.Value.ToString(); 
} 
return ""; 
2
DateTime? d; 
// stuff manipulating d; 
return d != null ? d.Value.ToString() : String.Empty; 
1
if (aDate.HasValue) 
    return aDate; 
else 
    return string.Empty; 
1
DateTime d?; 
string s = d.HasValue ? d.ToString() : string.Empty; 
7

Si potrebbe scrivere un metodo di estensione

public static string ToStringSafe(this DateTime? t) { 
    return t.HasValue ? t.Value.ToString() : String.Empty; 
} 

... 
var str = myVariable.ToStringSafe(); 
+4

O meglio: renderlo generico: 'stringa statica pubblica ToSafeString (questo T? Obj) dove T: struct' :) – JulianR

+0

Holy smokes, non ha realizzato .NET aveva questa capacità! – tster

16

In realtà, questo è il comportamento predefinito per i tipi Nullable, che senza un valore che restituiscono nulla :

public class Test { 
    public static void Main() { 
     System.DateTime? dt = null; 
     System.Console.WriteLine("<{0}>", dt.ToString()); 
     dt = System.DateTime.Now; 
     System.Console.WriteLine("<{0}>", dt.ToString()); 
    } 
} 

questo produce

<> 
<2009-09-18 19:16:09> 
+3

+1 Non lo sapevo. Tuttavia, non è possibile fornire una stringa di formattazione in questo modo. –

+0

Hm, giusto. Anche se questo potrebbe non essere un problema in questo caso. Non lo sapevo neanche io fino a ieri, però. Inciampandoci sopra guardando 'Nullable ' in Reflector :-) – Joey

87

Anche se molte di queste risposte sono corrette, tutti sono inutilmente complesse. Il risultato di chiamare ToString su un valore DateTime nullable è già una stringa vuota se il valore è logicamente nullo. Basta chiamare ToString sul valore; farà esattamente quello che vuoi.

+3

A meno che tu non voglia usare le proprietà DateTime come '.Day'' .Week' perché questo ti darà l'intera stringa DateTime e perderà la potenza della classe DateTime . per esempio. 'MyVariable.Value.Hour.ToString() '. Solo un esempio per cui potresti voler fare diversamente. – baron

+2

@baron, quelle proprietà non sono 'Nullable'. – Sam

4

Calling .ToString() su un Nullable<T> che è null restituirà una stringa vuota.

0

Tutto ciò che devi fare è semplicemente chiamare .ToString(). Gestisce l'oggetto Nullable<T> per il valore null.

Ecco la source of .NET Framework per Nullable<T>.ToString():

public override string ToString() { 
    return hasValue ? value.ToString() : ""; 
}