Установите количество десятичных разрядов в типе данных decimal - PullRequest
0 голосов
/ 31 марта 2020

У меня есть модель, которая содержит свойство типа данных decimal. Я хочу убедиться, что метод получения возвращает значение детерминированного c в каждом случае.

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

Следующая программа иллюстрирует результаты:

class Program
{
    static void Main(string[] args)
    {
        decimal d1 = decimal.Parse("1200.00");
        Console.WriteLine(d1); // Prints 1200.00
        decimal d2 = decimal.Parse("1200");
        Console.WriteLine(d2); // Prints 1200
        decimal d3 = correctDecimalPlaces(d2);
        Console.WriteLine(d3); // Prints 1200.00
    }
    static decimal correctDecimalPlaces(decimal d)
    {
        return decimal.Parse(d.ToString("0.00"));
    }
}

Как я могу контролировать количество десятичных знаков, используемых в типе данных decimal?

Чтобы изменить число десятичных значений я преобразую десятичную строку и обратно в десятичную. Вы знаете более чистый способ сделать это?

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Я нашел этот способ (если возвращаемая строка вам подходит):

public static class Extensions
{
    public static string ToStringDecimal(this decimal d, byte decimals)
    {
        var fmt = (decimals>0) ? "0." + new string('0', decimals) : "0";
        return d.ToString(fmt);
    }

    public static string ToStringDecimal(this decimal? d, byte decimals)
    {
        if (!d.HasValue) return "";
        return ToStringDecimal(d.Value, decimals);
    }
}

Или мы используем так:

 public static decimal? RoundTo2Decimal(decimal? pValue)   
        if (pValue.HasValue)
        {
            if (pValue.Value >= 0)
            {
                decimal vAluePos = pValue.Value * 100 + 0.5m;
                return Math.Floor(vAluePos) / 100;
            }

            decimal vAlueNeg = Math.Abs(pValue.Value) * 100 + 0.5m;
            return -(Math.Floor(vAlueNeg) / 100);
        }
        return null;
    }
1 голос
/ 31 марта 2020

Добавление 0.00m к десятичному числу, хотя и нелогично, заставит его иметь как минимум 2 десятичных знака. Если вам нужно убедиться, что он имеет ровно 2, вы можете также применить decimal.Round().

    static decimal correctDecimalPlaces(decimal d)
    {
        return decimal.Round(d + 0.00m, 2);
    }
...