2011-10-07 18 views
37

Me preguntaba si hay una sintaxis para dar formato a los valores NULL en string.Format, como lo Excel utiliza¿Puedo formatear valores NULL en string.Format?

Por ejemplo, el uso de Excel que podía especificar un valor de formato de {0:#,000.00;-#,000.00,NULL}, lo que significa mostrar el valor numérico como formato de número si es positivo, formato de número en paréntesis si es negativo, o NULL si el valor es nulo

string.Format("${0:#,000.00;(#,000.00);NULL}", someNumericValue); 

Editar

Busco formatear NULL/Nothing valores para todos los tipos de datos, no solo numéricos.

Mi ejemplo es realmente incorrecto porque pensé equivocadamente que Excel usó el 3er parámetro si el valor era NULL, pero en realidad se usa cuando el valor es 0. Lo dejo ahí porque es lo más cercano que se me ocurre a lo que esperaba hacer.

Tengo la esperanza de evitar que el operador coalescente nula porque estoy escribiendo entradas de registro, y los datos no suele ser una cadena

Sería mucho más fácil escribir algo así como

Log(string.Format("Value1 changes from {0:NULL} to {1:NULL}", 
    new object[] { oldObject.SomeValue, newObject.SomeValue })); 

que a escribo

var old = (oldObject.SomeValue == null ? "null" : oldObject.SomeValue.ToString()); 
var new = (newObject.SomeValue == null ? "null" : newObject.SomeValue.ToString()); 

Log(string.Format("Value1 changes from {0} to {1}", 
    new object[] { old, new })); 
+0

'null' (' Nothing' en Visual Basic) o '0' (cero)? – dtb

+0

@dtb Estoy buscando formatear 'nulo' /' Nada' – Rachel

+0

@JimMischel Disculpa, estaba pensando en valores NULL formateados en Excel con el 3er parámetro. En realidad son ceros. Actualizaré mi pregunta, pero dejaré el ejemplo de Excel allí porque es lo más cercano que puedo pensar a lo que estoy buscando. – Rachel

Respuesta

30

Se puede definir una custom formatter que devuelve "NULL" si el valor es null y por otra parte la cadena predeterminada con formato, por ejemplo,:

foreach (var value in new[] { 123456.78m, -123456.78m, 0m, (decimal?)null }) 
{ 
    string result = string.Format(
     new NullFormat(), "${0:#,000.00;(#,000.00);ZERO}", value); 
    Console.WriteLine(result); 
} 

Salida:

$123.456,78 
$(123.456,78) 
$ZERO 
$NULL 

personalizada Formateador:

public class NullFormat : IFormatProvider, ICustomFormatter 
{ 
    public object GetFormat(Type service) 
    { 
     if (service == typeof(ICustomFormatter)) 
     { 
      return this; 
     } 
     else 
     { 
      return null; 
     } 
    } 

    public string Format(string format, object arg, IFormatProvider provider) 
    { 
     if (arg == null) 
     { 
      return "NULL"; 
     } 
     IFormattable formattable = arg as IFormattable; 
     if (formattable != null) 
     { 
      return formattable.ToString(format, provider); 
     } 
     return arg.ToString(); 
    } 
} 
+0

¡Gracias, funciona exactamente como esperaba que funcionara! Acabas de hacer mi vida mucho más fácil :) – Rachel

+0

Esto no funciona para mí. Estoy escribiendo un JsonValueFormatter y el valor nulo nunca está ingresando al método de Formato. Si hago 'string.Format (formatter," Test: {0}, {1}, {2} ", true, 10, null," Hello ")' devuelve 'Test: true, 10,," Hello " '. –

11

no creo que haya nada en String.Format que le permitirá especificar un formato particular para null cuerdas. Una solución es utilizar el null-coalescing operator, así:

const string DefaultValue = "(null)"; 

string s = null; 
string formatted = String.Format("{0}", s ?? DefaultValue); 
+0

Ver mi pregunta actualizada. Esperaba evitar el uso de '??' porque los datos no suelen ser una cadena – Rachel

+1

@Rachel: ver mi respuesta actualizada. No hay ninguna razón por la que deba restringir el operador de fusión nula a cadenas. –

+9

Sí, pero quiero que el valor predeterminado sea '" NULL "' incluso si el tipo de datos es un número o una fecha. No puedo usar 'someNumber ?? "NULL" 'porque la cadena' "NULL" 'no es del mismo tipo de datos que' someNumber' – Rachel

2

¿Es esto lo que quieres?

string test; 

test ?? "NULL"

+0

Consulte mi pregunta actualizada. Esperaba evitar el uso de '??' porque los datos no suelen ser una cadena – Rachel

0

Se podría utilizar un método de extensión:

public static string ToDataString(this string prm) 
    { 
     if (prm == null) 
     { 
      return "NULL"; 
     } 
     else 
     { 
      return "'" + prm.Replace("'", "''") + "'"; 
     } 
    } 

Luego, en su código que puede hacer:

string Field1="Val"; 
string Field2=null; 

string s = string.Format("Set Value:{0}, NullValue={1}",Field1.ToDataString(), Field2.ToDataString()); 
+1

Esto no va a funcionar para el caso de usuario OP – miniBill

Cuestiones relacionadas