Подтвердить что ты не робот

Можно ли форматировать значения NULL в string.Format?

Мне было интересно, есть ли синтаксис для форматирования значений NULL в string.Format, например, что Excel использует

Например, с помощью Excel я могу указать значение формата {0:#,000.00;-#,000.00,NULL}, что означает отображение числового значения в виде номера, если оно положительное, формат номера в скобках, если отрицательный, или NULL, если значение равно null

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

Edit

Я ищу форматирование значений NULL/Nothing для всех типов данных, а не только для числовых.

Мой пример на самом деле неверен, потому что я ошибочно думал, что Excel использовал третий параметр, если значение было NULL, но оно фактически используется, когда значение равно 0. Я оставляю его там, потому что это самое близкое, о чем я могу думать что я надеялся сделать.

Я надеюсь избежать оператора с нулевым коалесцированием, потому что я записываю записи журнала, а данные обычно не являются строкой

Было бы намного проще написать что-то вроде

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

чем писать

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

Ответ 1

Вы можете определить custom formatter, который возвращает "NULL", если значение null и в противном случае форматированная строка по умолчанию, например:

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

Вывод:

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

Пользовательский форматирование:

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

Ответ 2

Я не думаю, что в String.Format ничего нет, что позволит вам указать конкретный формат для строк null. Обходным путем является использование оператора null-coalescing, например:

const string DefaultValue = "(null)";

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

Ответ 3

Это то, что вы хотите?

string test;

тест?? "NULL"

Ответ 4

Похоже, что String.Format для .NET действует так же, как Excel, т.е. вы можете использовать разделитель ; для положительных, отрицательных и 0 значений, но не NULL: http://msdn.microsoft.com/en-us/library/0c899ak8.aspx#SectionSeparator.

Вам, вероятно, просто придется вручную обрабатывать значение null:

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

Ответ 5

Вы можете использовать метод расширения:

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

Затем в коде вы можете:

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

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