2009-09-18 24 views
30

tengo una variable DateTime?, a veces el valor es null, ¿Cómo puedo devolver una cadena vacía "" cuando el valor es null o el valor DateTime cuando no null?C# anulable <DateTime> a cadena

Respuesta

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

Gracias, exactamente lo que estaba buscando –

+11

Qué !? Puede llamar a .ToString() en la instancia Nullable para obtener String.Empty. Incluso Eric Lippert (que incluso podría haber implementado este comportamiento) lo nota. _That_ debería ser la respuesta aceptada. – codekaizen

+1

@codekaizen - Obtengo una excepción cuando intento eso. Entonces no, esa no sería la respuesta aceptada. Quizás esto no sea un problema en las versiones más recientes de 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

Se puede escribir un método de extensión

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

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

O mejor aún: hacer que sea genérico: 'cadena pública estática ToSafeString (este T? Obj) donde T: struct' :) – JulianR

+0

Holy Smokes, no se dio cuenta .NET tenía esta habilidad! – tster

16

En realidad, este es el comportamiento por defecto para los tipos anulables, que sin un valor que retornan nada :

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()); 
    } 
} 

esto produce

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

+1 No sabía esto. Sin embargo, no puede suministrar una cadena de formateo de esta manera. –

+0

Hm, a la derecha. Aunque esto puede no ser un problema en este caso. Aunque yo no sabía esto yo mismo hasta ayer. Tropecé con eso al mirar 'Nullable ' en Reflector :-) – Joey

87

Aunque muchas de estas respuestas son correctas, todos ellos son innecesariamente compleja. El resultado de llamar a ToString en un DateTime anulable ya es una cadena vacía si el valor es lógicamente nulo. Simplemente llame a ToString en su valor; Hará exactamente lo que quieras.

+3

A menos que quieras usar las propiedades de DateTime como '.Day'' .Week' porque eso te dará la cadena completa de DateTime y perderá el poder de la clase DateTime . p.ej. 'myVariable.Value.Hour.ToString() '. Solo un ejemplo de por qué es posible que desee hacer lo contrario. – baron

+2

@baron, esas propiedades no son 'Nullable'. – Sam

4

Llamar a .ToString() en un Nullable<T> que es null devolverá una cadena vacía.

0

Todo lo que necesita hacer es simplemente llamar al .ToString(). Maneja el objeto Nullable<T> para el valor null.

Aquí es el source of .NET Framework para Nullable<T>.ToString():

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