Как эффективно проверить точность и масштаб числового значения? - PullRequest
6 голосов
/ 10 октября 2008

Я пишу подпрограмму, которая проверяет данные перед их вставкой в ​​базу данных, и один из шагов состоит в том, чтобы посмотреть, соответствуют ли числовые значения точности и масштабу типа Numeric (x, y) SQL-Server.

У меня уже есть точность и масштаб из SQL-Server, но какой самый эффективный способ в C # получить точность и масштаб значения CLR или, по крайней мере, проверить, соответствует ли оно данному ограничению?

В данный момент я конвертирую значение CLR в строку, а затем ищу расположение десятичной точки с помощью .IndexOf (). Есть ли более быстрый способ?

Ответы [ 4 ]

8 голосов
/ 11 октября 2008
System.Data.SqlTypes.SqlDecimal.ConvertToPrecScale( new SqlDecimal (1234.56789), 8, 2)

дает 1234,67. он усекает лишние цифры после запятой и выдает ошибку, а не пытается урезать цифры до запятой (т.е. ConvertToPrecScale (12344234, 5,2)

4 голосов
/ 14 июля 2016

Не вызывая исключения, вы можете использовать следующий метод, чтобы определить, соответствует ли значение ограничениям точности и масштаба.

private static bool IsValid(decimal value, byte precision, byte scale)
{
    var sqlDecimal = new SqlDecimal(value);

    var actualDigitsToLeftOfDecimal = sqlDecimal.Precision - sqlDecimal.Scale;

    var allowedDigitsToLeftOfDecimal = precision - scale;

    return 
        actualDigitsToLeftOfDecimal <= allowedDigitsToLeftOfDecimal && 
        sqlDecimal.Scale <= scale;
}
2 голосов
/ 21 февраля 2018

Вот математический подход.

private static bool IsValidSqlDecimal(decimal value, int precision, int scale)
{
    var minOverflowValue = (decimal)Math.Pow(10, precision - scale) - (decimal)Math.Pow(10, -scale) / 2;
    return Math.Abs(value) < minOverflowValue;
}

Это учитывает, как сервер sql будет выполнять округление и предотвращать ошибки переполнения, даже если мы превышаем точность. Например:

DECLARE @value decimal(10,2)
SET @value = 99999999.99499 -- Works
SET @value = 99999999.995   -- Error
0 голосов
/ 10 октября 2008

Вы можете использовать decimal.Truncate (val), чтобы получить неотъемлемую часть значения, и decimal.Remainder (val, 1), чтобы получить часть после десятичной точки, а затем проверить, что каждая часть соответствует вашим ограничениям (я угадать это может быть просто> или <проверка) </p>

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