Фиксированная длина с плавающей запятой Форматирование чисел С#

Я хочу отформатировать число с плавающей запятой следующим образом в С#, чтобы вся ширина числа с плавающей запятой в С# была фиксированной длины (эквивалентный спецификатор формата python 6.2f). Я НЕ хочу, чтобы он был дополнен 0 слева, но заполнено пробелом

100.00
 90.45
  7.23
  0.00

что я пробовал до сих пор

string.Format({0:###.##},100); 
string.Format({0:###.##},90.45);
string.Format({0:###.##},7.23);
string.Format({0:###.##},0.00);

но вывод неверный

100
90.45
7.23
      //nothing is printed

Я также прошел через это но не могу найти решение. Я знаю о методе string.PadLeft, но мне интересно, есть ли более правильный способ, чем

(string.format({0,0.00},number)).PadLeft(6," ")

EDIT Я специально спрашиваю, есть ли правильный встроенный метод для того же самого, а не можно ли это сделать с помощью того же математического волшебства.


person Siddharth Chabra    schedule 13.08.2018    source источник
comment
Возможный дубликат двойного форматирования C#, выравнивающего десятичный знак   -  person maccettura    schedule 13.08.2018
comment
@maccettura как это дубликат? Я спросил, есть ли спецификатор формата для этого? Теперь, если это может быть не так? любой может написать сложный набор операторов if для достижения моей цели, я спросил, есть ли встроенный метод С#   -  person Siddharth Chabra    schedule 13.08.2018
comment
Я не знаю строки формата, которая будет это делать, но ваша левая панель выглядит нормально...   -  person Jon Skeet    schedule 13.08.2018
comment
@SiddharthChabra, как вы ожидаете, что спецификатор формата узнает о длине всех ваших других чисел? Вы ищете свои числа для выравнивания, дубликат отлично подходит для этого. Если вы хотите узнать, может ли спецификатор формата это сделать, то ответ нет   -  person maccettura    schedule 13.08.2018
comment
@maccettura вы когда-нибудь пробовали string.format({0,16},integer) это говорит C# назначить 16-значное пространство для целого числа, даже если число меньше, а расширение числа больше. Удалите дубликат тега, так как сообщение с тегом не отвечает на мой вопрос.   -  person Siddharth Chabra    schedule 13.08.2018
comment
@SiddharthChabra указать отступы не сложно. Зная, где находится десятичный знак раньше времени, когда каждое отдельное число может быть отформатировано/округлено/усечено, является сложной частью.   -  person maccettura    schedule 13.08.2018
comment
@maccettura Я думаю, вам следует прочитать ссылку, которую я пометил, поскольку я указываю .00, я четко указываю десятичные разряды = 2, если не 2, добавьте 0 и сделайте это 2. Вы знаете, что это можно сделать в c/c++/python без проблем , Поэтому я спросил, можно ли это сделать на C#, Если ответ «Нет, так тому и быть, но пусть ответит сообщество», Неправильная пометка означает, что дублирование недопустимо   -  person Siddharth Chabra    schedule 13.08.2018
comment
@SiddharthChabra Я действительно думаю, что нашел ответ. Я не думал, что эта функция поддерживается так, как вы хотели, но решение, которое я нашел, может сработать. Однако он дополняется нулями.   -  person maccettura    schedule 13.08.2018
comment
@maccettura Пожалуйста, посмотрите на ответ ниже. это можно сделать с помощью спецификатора формата без заполнения нулями.   -  person Siddharth Chabra    schedule 14.08.2018


Ответы (2)


Если вам всегда нужны 2 цифры после запятой, вы можете указать 00 в спецификаторе формата. Вам также нужно будет использовать ширину поля с выравниванием по правому краю (я использовал 6 в качестве максимальной ширины поля).

Попробуй это:

void Main()
{
    Console.WriteLine(string.Format("{0,6:##0.00}",100.0)); 
    Console.WriteLine(string.Format("{0,6:##0.00}",90.45));
    Console.WriteLine(string.Format("{0,6:##0.00}",7.23));
    Console.WriteLine(string.Format("{0,6:##0.00}",0.00));
}

В LinqPad выводит:

100.00
 90.45
  7.23
  0.00
person Chris Dunaway    schedule 13.08.2018

В современном .NET 5.0+ вам не нужно вызывать каталог string.Format. Вместо этого используйте $ перед вашей строкой и разделяйте переменные с помощью {..}

double float1 = 100.0;
double float2 = 0.2;
Debug.WriteLine($"{float1:##0.00}");    // 100.00
Debug.WriteLine($"{float2:##0.00}");    // 0.20
person Rob Hoff    schedule 26.07.2021