Переменные десятичные разряды в .Net string formers?

Исправлено десятичное число.

String.Format("{0:F1}", 654.321);

дает

654.3

Как подавать число десятичных знаков в качестве параметра, как вы можете в C? Так

String.Format("{0:F?}", 654.321, 2);

дает

654.32

Я не могу найти, что должно заменить?

Ответ 1

Используйте NumberFormatInfo:

Console.WriteLine(string.Format(new NumberFormatInfo() { NumberDecimalDigits = 2 }, "{0:F}", new decimal(1234.567)));
Console.WriteLine(string.Format(new NumberFormatInfo() { NumberDecimalDigits = 7 }, "{0:F}", new decimal(1234.5)));

Ответ 2

Строка в формате не обязательно должна быть константой.

int numberOfDecimalPlaces = 2;
string formatString = String.Concat("{0:F", numberOfDecimalPlaces, "}");
String.Format(formatString, 654.321);

Ответ 3

Вероятно, наиболее эффективный подход для форматирования одного значения:

int decimalPlaces= 2;
double value = Math.PI;
string formatString = String.Format("F{0:D}", decimalPlaces);
value.ToString(formatString);

Ответ 4

Я использую подход с интерполированной строкой, похожий на ответ вольфганга, но немного более компактный и читаемый (ИМХО):

using System.Globalization;
using NF = NumberFormatInfo;

...

decimal size = 123.456789;  
string unit = "MB";
int fracDigs = 3;

// Some may consider this example a bit verbose, but you have the text, 
// value, and format spec in close proximity of each other. Also, I believe 
// that this inline, natural reading order representation allows for easier 
// readability/scanning. There is no need to correlate formats, indexes, and
// params to figure out which values go where in the format string.
string s = $"size:{size.ToString("N",new NF{NumberDecimalDigits=fracDigs})} {unit}";

Ответ 5

Используйте строку пользовательского числового формата Ссылка

var value = 654.321;
var s = value.ToString("0.##");

Ответ 6

использование

string.Format("{0:F2}", 654.321);

Выход будет

654,32