Reputation: 21241
Fixed decimal places is easy
String.Format("{0:F1}", 654.321);
gives
654.3
How do I feed the number of decimal places in as a parameter like you can in C? So
String.Format("{0:F?}", 654.321, 2);
gives
654.32
I can't find what should replace the ?
Upvotes: 33
Views: 16463
Reputation: 96
Another Fixed-point format with short interpolated string variant:
var value = 654.321;
var decimals = 2;
var s = value.ToString($"F{decimals}");
Upvotes: 0
Reputation: 51
I used two interpolated strings (a variant of Michael's answer):
double temperatureValue = 23.456;
int numberOfDecimalPlaces = 2;
string temperature = $"{temperatureValue.ToString($"F{numberOfDecimalPlaces}")} \u00B0C";
Upvotes: 1
Reputation: 6015
Another option is using interpolated strings like this:
int prec = 2;
string.Format($"{{0:F{prec}}}", 654.321);
Still a mess, but yet more convenient IMHO. Notice that string interpolation replaces double braces, like {{
, with a single brace.
Upvotes: 4
Reputation: 74360
I use an interpolated string approach similar to Wolfgang's answer, but a bit more compact and readable (IMHO):
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}";
Upvotes: 1
Reputation: 1008
Use 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)));
Upvotes: 20
Reputation: 806
Probably the most efficient approach for formatting a single value:
int decimalPlaces= 2;
double value = Math.PI;
string formatString = String.Format("F{0:D}", decimalPlaces);
value.ToString(formatString);
Upvotes: 1
Reputation: 3362
Use the custom numeric format string Link
var value = 654.321;
var s = value.ToString("0.##");
Upvotes: -1
Reputation: 5427
The string to format doesn't have to be a constant.
int numberOfDecimalPlaces = 2;
string formatString = String.Concat("{0:F", numberOfDecimalPlaces, "}");
String.Format(formatString, 654.321);
Upvotes: 23