c# string-formatting string.format

c# - ¿Puedo formatear valores NULL en string.Format?



string-formatting (5)

Me preguntaba si hay una sintaxis para formatear valores NULL en cadena.Formato, como lo que usa Excel

Por ejemplo, usando Excel, podría especificar un valor de formato de {0:#,000.00;-#,000.00,NULL} , lo que significa mostrar el valor numérico como formato numérico si es positivo, formato numérico entre paréntesis si es negativo o NULO si el el valor es nulo

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

Editar

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

Mi ejemplo es incorrecto porque pensé erróneamente que Excel usó el tercer parámetro si el valor era NULL, pero en realidad se usa cuando el valor es 0. Lo dejo allí porque es lo más parecido a lo que podía pensar. esperando hacer

Espero evitar el operador nulo coalescente porque estoy escribiendo registros de registro, y los datos no suelen ser una cadena

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

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

que escribir

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


¿Es esto lo que quieres?

string test;

prueba ?? "NULO"


No creo que haya nada en String.Format que te permita especificar un formato particular para cadenas null . Una solución alternativa es usar el operador nulo-coalescente , así:

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


Parece que String.Format para .NET actúa de la misma manera que Excel, es decir, puede usar ; separador para valores positivos, negativos y 0, pero no NULL: http://msdn.microsoft.com/en-us/library/0c899ak8.aspx#SectionSeparator .

Probablemente solo deba manejar el valor nulo manualmente:

if (myval == null) // handle else return String.Format(...);


Puede definir un formateador personalizado que devuelva "NULL" si el valor es null y, de lo contrario, la cadena con formato predeterminado, 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

Formateador personalizado:

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


Puede usar un método de extensión:

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

Luego en tu código puedes hacer:

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