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