String.Format vs ToString и использование InvariantCulture

Я немного запутался здесь.

Что я должен использовать

Console.WriteLine((val/1085).ToString("N"));

VS

Console.WriteLine(String.Format("{0:N}", (val/1085)));

Также как мне соответствовать InvariantCulture? ЛЮБАЯ ЛУЧШАЯ ПРАКТИКА:)?

Ответ 1

На самом деле я предпочитаю третью форму:

Console.WriteLine("{0:N}", val / 1085);

Console.WriteLine может сделать String.Format для вас.

Console.WriteLine не позволяет вам предоставлять культуру. Если это то, что вы хотите, вам все равно придется использовать String.Format. Как в:

String.Format(CultureInfo.InvariantCulture, "{0:N}", 123456789);

Я не рекомендую использовать это, потому что у международных пользователей будет проблема с этим. Мне 123,456,789.00 выглядит странно.

Ответ 2

Для форматирования + культуры я предпочитаю:

 .ToString("####0.00",CultureInfo.InvariantCulture)

или

.ToString("N",CultureInfo.InvariantCulture)

Ответ 3

В datetime это нормально использовать оба. Я предпочитаю использовать и видеть первое решение (конечно же, с отсутствующими скобками).

String.Format гораздо полезнее, если у вас есть строка с пробелами для каких-то параметров. Тогда это метод убийцы, который действительно поможет вам организовать ваш код.

Ответ 4

Используя строковую интерполяцию с методами расширения, я нашел инвариантный и общий способ решить это следующим образом:

public static class Extensions
{
    public static string ToStringInvariant<T>(this T obj)
    {
        return System.FormattableString.Invariant($"{obj}");
    }
}

Использование просто, просто используйте .ToStringInvariant() вместо .ToString(). Преимущество заключается в том, что он работает для любого типа данных.

Больше информации: Метод FormattableString.Invariant(FormattableString)