Как форматировать десятичное число С#, чтобы удалить дополнительные следующие 0?
Я хочу отформатировать строку как десятичную, но десятичное число содержит следующие нули после десятичной. Как его форматировать так, чтобы исчезли эти бессмысленные 0?
string.Format("{0}", 1100M);
string.Format("{0}", 1100.1M);
string.Format("{0}", 1100.100M);
string.Format("{0}", 1100.1000M);
отображается:
1100
1100.1
1100.100
1100.1000
но я хочу, чтобы это было:
1100
1100.1
1100.1
1100.1
Для справки, вот другие вопросы, которые по сути являются дубликатами этого, что я нашел благодаря ответам, приведенным здесь:
Ответы
Ответ 1
Вы можете использовать ToString()
с спецификатором формата() для для достижения желаемого результата, Заканчивающиеся нули усекаются при использовании этой строки формата с заданной точностью. Чтобы предотвратить округление в любых ситуациях, вам необходимо установить точность максимально допустимой для десятичных знаков (29).
Строка кода для создания того, что вы хотите, это number.ToString("G29")
, где number
- ваш исходный десятичный знак.
Имейте в виду, что любые числа, меньшие 0,0001, будут преобразованы в научную нотацию. Более подробную информацию о том, как работает этот форматировщик, можно найти в ссылке выше.
Ответ 2
string s = d.ToString("0.#############################");
Ответ 3
Они не обязательно бессмысленны - они указывают точность во время расчета. Десятичные числа сохраняют свой уровень точности, а не нормализуются.
У меня есть код в этом ответе, который вернет нормализованное значение - вы можете использовать его, а затем отформатировать результат. Например:
using System;
using System.Numerics;
class Test
{
static void Display(decimal d)
{
d = d.Normalize(); // Using extension method from other post
Console.WriteLine(d);
}
static void Main(string[] args)
{
Display(123.4567890000m); // Prints 123.456789
Display(123.100m); // Prints 123.1
Display(123.000m); // Prints 123
Display(123.4567891234m); // Prints 123.4567891234
}
}
Я подозреваю, что большинство подстрок строк формата не сработают. Я бы предположил, что строка формата "0." а затем 28 # символов будут работать, но это было бы очень уродливо...
Ответ 4
Вы можете указать строку формата следующим образом:
String.Format("{0:0.000}", x);
Ответ 5
Как насчет:
string FormatDecimal(decimal d)
{
const char point = System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator[0];
string s = d.ToString();
// if there no decimal point, there nothing to trim
if (!s.Contains(point) == -1)
return s;
// trim any trailing 0s, followed by the decimal point if necessary
return s.TrimEnd('0').TrimEnd(point);
}
Ответ 6
В отличие от того, что все предлагают использовать спецификатор формата G
, я бы предложил следующее сохранить как тысячу разделителей, так и десятичную точку при удалении лишних нулей:
{0:#,#.##}
Результат этого формата в большинстве случаев намного лучше, чем G:
String.Format("{0:#,#.##}",25/2.4);
10.42
String.Format("{0:#,#.##}",1000000);
1,000,000
String.Format("{0:#,#.##}",1000000.3600000);
1,000,000.36
И спецификатор G
не может справиться со всеми возможными комбинациями:
String.Format("{0:G29}",25/2.4);
10.416666666666668
String.Format("{0:G2}",25/2.4);
10
String.Format("{0:G29}",1000000.3600000);
1000000.36
String.Format("{0:G2}",1000000.3600000);
1E+06
Ответ 7
Уже несколько ответов. Я часто говорю об этом чит-листе: http://blog.stevex.net/string-formatting-in-csharp/
Ответ 8
String.Format("{0:0.##}", 123.0); // "123"
Ответ 9
Я считаю, что вы хотите сделать:
var s = String.Format("{0:#####.###}");
Ответ 10
Немного хакерский, но это должно работать:
decimal a = 100.00M;
string strNumber = string.Format("{0}", a);
Console.WriteLine(strNumber.Contains('.') ? strNumber.TrimEnd('0').TrimEnd('.') : strNumber);
Ответ 11
double a = 1100.00
double b =1100.1
double c = 1100.100
double d =1100.1000
Remove last zero after point
string stra = a.toString("0.00").TrimEnd('0').TrimEnd('.');
string strb = b.toString("0.00").TrimEnd('0').TrimEnd('.');
string strc = c.toString("0.00").TrimEnd('0').TrimEnd('.');
string strd = d.toString("0.00").TrimEnd('0').TrimEnd('.');
Output
1100
1100.1
1100.1
1100.1