Почему C # усекает точность строк во время форматирования? - PullRequest
0 голосов
/ 13 июня 2018

При наличии строки и двойного значения одинакового значения string.Format усекается по-разному.

double x = 88.2;
string y = "88.2";
string output_1 = String.Format("{0:0.00}", x);
string output_2 = String.Format("{0:0.00}", y);

В этом случае output_1 будет '88 .20', а output_2 - '88 .2 '.

Есть ли способ сделать это без использования

Double double_var;
string output;
if (Double.TryParse(input, out double_var))
{
    output = String.Format("{0:0.00}", double_var);
}
else
{
    output = String.Format("{0:0.00}", input);
}

Это для универсального сборщика файлов, который я создаю для наборов записей в файлах, и я действительно хотел бы избежать этого, если это возможно.

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

string не реализует IFormattable, поэтому любой указанный аргумент форматирования будет просто проигнорирован.С другой стороны, double может интерпретировать предоставленный спецификатор формата 0.00.

Примечание: C # 6 имеет FormattableString, но только для поддержки различных культур для аргументов формата в интерполированных строках.

0 голосов
/ 13 июня 2018

String.Format не будет применять формат к строке.Вы знаете, что строка содержит число, а .NET - нет.

Так что да, вам придется проанализировать строку в число и отформатировать это число.

От MSDN: String.Format () :

Ряд типов поддерживает строки формата, включая все числовые типы (строки как стандартного, так и пользовательского формата), все даты и время (строки как стандартного, так и пользовательского формата) и интервалы времени (строки как стандартного, так и пользовательского формата),все типы перечисления, типы перечисления и GUID.Вы также можете добавить поддержку строк формата для своих собственных типов.

Сюда не входят строки.

Чтобы объект поддерживал строки настраиваемого формата, ему необходимо реализовать IFormattable, что делают упомянутые выше типы.

С учетом этих классов:

public class FormattableFoo : IFormattable 
{
    public string ToString(string format, IFormatProvider provider)
    {
        return $"FooFormat: '{format}'";
    }
}

public class Foo
{
    public override string ToString()
    {
        return "Foo";
    }
}

И эти вызовы:

Console.WriteLine("{0:0.00}", new Foo());
Console.WriteLine("{0:0.00}", new FormattableFoo());

Выходные данныебудет:

Foo
FooFormat: '0.00'

Если System.String не реализует IFormattable (и не Foo), его метод ToString() будет вызван без формата.

См. Также MSDN: Настройка строк формата .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...