Могу ли я форматировать нулевые значения в string.Форматировать?

#c# #string-formatting #string.format

#c# #форматирование строки #string.format

Вопрос:

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

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

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

Редактировать

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

Мой пример на самом деле неверен, потому что я ошибочно думал, что Excel использует 3-й параметр, если значение равно НУЛЮ, но на самом деле он используется, когда значение равно 0. Я оставляю это там, потому что это самое близкое, что я могу придумать, к тому, что я надеялся сделать.

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

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

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

Комментарии:

1. null ( Nothing в Visual Basic) или 0 (ноль)?

2. @dtb Я ищу форматирование null / Nothing

3. @JimMischel Извините, я думал, что Excel отформатировал нулевые значения с помощью 3-го параметра. На самом деле это нули. Я обновлю свой вопрос, но я оставляю там пример Excel, поскольку это самое близкое, что я могу придумать, к тому, что я ищу.

Ответ №1:

Вы можете определить пользовательский форматировщик, который возвращает "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();
    }
}
  

Комментарии:

1. Спасибо, это работает именно так, как я надеялся, что это сработает! Вы только что сделали мою жизнь намного проще 🙂

2. У меня это не работает. Я пишу JsonValueFormatter, и значение null никогда не вводится в метод Format . Если я это сделаю string.Format(formatter, "Test: {0}, {1}, {2}", true, 10, null, "Hello") , он вернется Test: true, 10, , "Hello" .

Ответ №2:

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

 const string DefaultValue = "(null)";

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

Комментарии:

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

2. @Rachel: Смотрите мой обновленный ответ. Нет причин, по которым вам нужно ограничивать оператор объединения нулей строками.

3. Да, но я хочу, чтобы значение по умолчанию было "NULL" , даже если тип данных — число или дата. Я не могу использовать someNumber ?? "NULL" , потому что строка "NULL" не имеет того же типа данных, что и someNumber

Ответ №3:

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

 string test;
  

тест?? «NULL»

Комментарии:

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

Ответ №4:

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

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

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