C # эквивалент BigDecimal.stripTrailingZeros () - PullRequest
3 голосов
/ 21 февраля 2011

В Java вы можете использовать BigDecimal.stripTrailingZeros() для удаления лишних нулей в конце.

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

Этот вопрос , например, ответ на выполнение ToString ("G") не всегда работает.

В идеале я хотел бы функциюэто делает десятичное число -> десятичное с новым десятичным числом, имеющим наименьший возможный масштаб без потери какой-либо информации или удаления конечных нулей.

Есть ли способ сделать это легко?Или это будет включать в себя возиться с decimal.GetBits()?

РЕДАКТИРОВАТЬ: Следует также добавить, что у меня есть i18n, чтобы беспокоиться о том, что выполнение строки не влияет на результатидеально из-за различий в десятичных разделителях.

Ответы [ 3 ]

2 голосов
/ 21 февраля 2011

Как насчет Decimal.Parse(d.ToString("0.###########################"))?

1 голос
/ 21 февраля 2011

Вот то, что я придумал (сумасшедший код, но работает плавно)

private decimal Normalize(decimal d)
{
    string[] tmp = d.ToString().Split('.');
    string val = tmp[0];    
    string fraction = null;
    decimal result;
    if(tmp.Length > 1) fraction = tmp[1];
    if(fraction != null && Getleast(fraction) > 0) 
    {
        decimal.TryParse(val.ToString() + "." + fraction.TrimEnd('0').ToString(),out result);
    }
    else
    {
        return decimal.Parse(val);
    }
    return result;
}

private decimal Getleast(string str)
{
    decimal res;
    decimal.TryParse(str.TrimEnd('0'),out res);// It returns 0 even if we pass null or empty string
    return res;
}

Вот пример ввода:

Console.WriteLine(Normalize(0.00M));
Console.WriteLine(Normalize(0.10M));
Console.WriteLine(Normalize(0001.00M));
Console.WriteLine(Normalize(1000.01M));
Console.WriteLine(Normalize(1.00001230M));
Console.WriteLine(Normalize(0031.200M));        
Console.WriteLine(Normalize(0.0004000M));
Console.WriteLine(Normalize(123));

И соответствующий вывод:

0
0.1
1
1000.01
1.0000123
31.2
0.0004
123
0 голосов
/ 21 февраля 2011

Не самое элегантное из решений, но оно должно делать все, что вам нужно.

 private decimal RemoveTrailingZeros(decimal Dec)
    {
        string decString = Dec.ToString();

        if (decString.Contains("."))
        {
            string[] decHalves = decString.Split('.');

            int placeholder = 0, LoopIndex = 0;

            foreach (char chr in decHalves[1])
            {
                LoopIndex++;
                if (chr != '0')
                    placeholder = LoopIndex;
            }

            if (placeholder < decHalves[1].Length)
                decHalves[1] = decHalves[1].Remove(placeholder);

            Dec = decimal.Parse(decHalves[0] + "." + decHalves[1]);
        }

        return Dec;
    }

Исправлена ​​версия, спасибо Shekhar_Pro!

...