Ответ 1
Я думаю, что вам нужно это (подробнее в моем ответе здесь):
public static decimal Normalize(decimal value)
{
return value/1.000000000000000000000000000000000m;
}
Я заметил, что .NET имеет некоторое напуганное/неинтуитивное поведение, когда речь идет о десятичных и конечных нулях.
0m == 0.000m //true
0.1m == 0.1000m //true
но
(0m).ToString() == (0.000m).ToString() //false
(0.1m).ToString() == (0.1000m).ToString() //false
Я знаю о необходимости соблюдения стандарта CLI ECMA. Однако я хотел бы знать, существует ли встроенный способ обрезания конечных нулей для десятичного значения без прохождения строкового представления (.ToString( "G29" ) и синтаксический анализ разбора будет работать, но не является быстрым и элегантным решением)
Любые идеи? Большое спасибо.
Я думаю, что вам нужно это (подробнее в моем ответе здесь):
public static decimal Normalize(decimal value)
{
return value/1.000000000000000000000000000000000m;
}
Используйте строку формата, чтобы указать вывод ToString():
(0.1m).ToString("0.#") -> "0.1"
(0.10000m).ToString("0.#") -> "0.1"
Используйте "0" в формате, чтобы указать цифру или несущественную цифру 0, используйте "#", чтобы указать значительную цифру или подавить несущественную цифру 0.
Изменить: я предполагаю, что вы беспокоитесь о визуальном (строковом) представлении числа - если нет, я удалю свой ответ.
Мне это не очень нравится, но он работает (для некоторого диапазона значений, по крайней мере)...
static decimal Normalize(decimal value)
{
long div = 1;
while(value - decimal.Truncate(value) != 0)
{
div *= 10;
value *= 10;
}
if(div != 1) {
value = (decimal)(long)value / div;
}
return value;
}