У меня есть десятичное значение, которое имеет переменное число цифр после .
, например:
0.0030
0.0310
0.0001
1.1200
Как написать динамическую функцию, которая удаляет 0 в конце десятичного числа?
У меня есть десятичное значение, которое имеет переменное число цифр после .
, например:
0.0030
0.0310
0.0001
1.1200
Как написать динамическую функцию, которая удаляет 0 в конце десятичного числа?
string.Format("{0:0.#####}", 0.0030)
или
var money=1.3000m;
money.ToString("0.#####");
Для справок в будущем я рекомендую . Краткая справочная информация по строкам NET Format от John Sheehan.
Вы также можете изменить сам десятичный знак, чтобы любой ToString() предоставил вам то, что вы хотите (подробнее в моем ответе здесь):
public static decimal Normalize(decimal value)
{
return value/1.000000000000000000000000000000000m;
}
decimal value = 0.0030m;
value.ToString("G29″);
Изменить: форматирует G, но единственная проблема заключается в том, что он перескакивает в научную нотацию, если в исходном десятичном знаке слишком много значимых цифр. Не так идеально.
См. "Спецификатор формата General (" G ") здесь: http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx#GFormatString
Я нахожусь на ланче, поэтому я сделал небольшое испытание:
decimal d1 = 0.000100m;
decimal d2 = 0.001000000000000000000000m;
decimal d3 = 0.000000000000001000000000m;
Console.WriteLine(Environment.NewLine + "input decimal: 0.000100m");
Console.WriteLine("G " + d1.ToString("G"));
Console.WriteLine("G29 " + d1.ToString("G29"));
Console.WriteLine("0.####### " + d1.ToString("0.#######"));
Console.WriteLine(Environment.NewLine + "input decimal: 0.001000000000000000000000m");
Console.WriteLine("G " + d2.ToString("G"));
Console.WriteLine("G29 " + d2.ToString("G29"));
Console.WriteLine("0.####### " + d2.ToString("0.#######"));
Console.WriteLine(Environment.NewLine + "input decimal: 0.000000000000001000000000m");
Console.WriteLine("G " + d3.ToString("G"));
Console.WriteLine("G29 " + d3.ToString("G29"));
Console.WriteLine("0.####### " + d3.ToString("0.#######"));
Вывод:
input decimal: 0.000100m
G 0.000100
G29 0.0001
0.####### 0.0001
input decimal: 0.001000000000000000000000m
G 0.001000000000000000000000
G29 0.001
0.####### 0.001
input decimal: 0.000000000000001000000000m
G 0.000000000000001000000000
G29 1E-15
0.####### 0
Хмм, это проблема форматирования отображения (нули добавляются при преобразовании десятичной строки в строку).
Вам нужно увидеть, где в коде вы видите конечные нули. Это после вызова .ToString()? Попробуйте сыграть с разными строками форматирования:
.ToString("#");
.ToString("0.00");
.ToString("#.##");
И так далее. Лучший способ сделать это - просто поэкспериментировать с различными возможными значениями.
decimal m = 0.030000m;
Console.Write(m.ToString("0.##########"));
Просто убедитесь, что у вас достаточно #s для количества десятичных знаков, которые вы хотите отобразить
Я использую следующее. Он гарантирует, что любое десятичное число (для которого максимальная точность равно 29 десятичным разрядам) покажет все доступные цифры точности без конечных нулей и без вашего кода, который должен иметь длинную уродливую строку хэш-меток.
if (value is Decimal)
value = ((Decimal)value).ToString("0.".PadRight(29, '#'), culture);
public static string GentlyRemoveEndZeros(string input)
{
// if (input == null) return null;
// if (input == "") return "";
if (input.Contains(".")) return input.TrimEnd('0').TrimEnd('.');
return input;
}
Усекать конечные Zeros очень легко, разрешить с помощью дуплексного литья:
decimal mydecimal = decimal.Parse("1,45000000"); //(I)
decimal truncate = (decimal)(double)mydecimal; //(II)
(I) → Разделить десятичное значение из любого источника строки.
(II) → Сначала: Сдвинуть, чтобы удвоить это, удалите конечные нули. Second: Other cast to decimal, потому что не существует неявного преобразования из десятичного в double и наоборот)