Всем привет!
У функции есть аргумент типа object.
Как определить что пришедшее значение это целое число, т.е. значение может быть любого из целых типов — int, int64, uint и т.п., а также и для случаев когда тип значений чо-то типа float, double, но само значение целое число, например 1.0.
т.е. важна именно суть — что значение целое число. неважно во что упаковано.
чо-то кроме тупого перечисления всех возможных типов решения в голову не приходит...
может кто знает какое-то элегантное решение?
Re: как проверить целое ли число?
От:
Аноним
Дата:
10.09.11 20:22
Оценка:
Здравствуйте, MadHuman, Вы писали:
MH>Всем привет! MH>У функции есть аргумент типа object. MH>Как определить что пришедшее значение это целое число, т.е. значение может быть любого из целых типов — int, int64, uint и т.п., а также и для случаев когда тип значений чо-то типа float, double, но само значение целое число, например 1.0. MH>т.е. важна именно суть — что значение целое число. неважно во что упаковано. MH>чо-то кроме тупого перечисления всех возможных типов решения в голову не приходит... MH>может кто знает какое-то элегантное решение?
Здравствуйте, MadHuman, Вы писали:
MH>может кто знает какое-то элегантное решение?
Элегантное решение у изначально некрасивой задачи? Почему бы не ограничиться двумя перегрузками для int/double?
неплохо, но если значение какой-то объект к числам никак не относящийся, то ексепшн будет, а надо false вернуть...
можно конечно в try catch обернуть, но выглядит как костыль.
и строка это не число а эта функция сконвертирует её к числу и вернет — true.
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, MadHuman, Вы писали:
MH>>может кто знает какое-то элегантное решение? S>Элегантное решение у изначально некрасивой задачи? Почему бы не ограничиться двумя перегрузками для int/double?
потому что функция обобщённая и аргумент интерпретируется по разному в зависимости от сути значения.
Здравствуйте, MadHuman, Вы писали:
MH>потому что функция обобщённая и аргумент интерпретируется по разному в зависимости от сути значения.
А вот это — прямой путь к косякам. Придёт 1.234E-5 — что будете делать?
Вообще, кардинальное изменение алгоритма обработки в зависимости от входных данных — это очень, очень плохая практика. Если всё-таки припёрло — хотя бы разнесите код диспетчера и код обработки по раздельным слоям. Чтобы проверить отсутствие дробной части, можно сравнивать Math.Abs((x — Math.Truncate(x)) / x) с близкой к 0 дельтой.
Re[3]: как проверить целое ли число?
От:
Аноним
Дата:
11.09.11 20:40
Оценка:
MH>неплохо, но если значение какой-то объект к числам никак не относящийся, то ексепшн будет, а надо false вернуть... MH>можно конечно в try catch обернуть, но выглядит как костыль. MH>и строка это не число а эта функция сконвертирует её к числу и вернет — true.
Изначальная задача явно не корректная и приводит к явно кривому коду
Я написал первое что пришло в голову... передавать object в функцию и потом в зависимости от типа принимать решение это не есть гуд.
Здравствуйте, MadHuman, Вы писали:
MH>Всем привет! MH>У функции есть аргумент типа object. MH>Как определить что пришедшее значение это целое число, т.е. значение может быть любого из целых типов — int, int64, uint и т.п., а также и для случаев когда тип значений чо-то типа float, double, но само значение целое число, например 1.0. MH>т.е. важна именно суть — что значение целое число. неважно во что упаковано. MH>чо-то кроме тупого перечисления всех возможных типов решения в голову не приходит... MH>может кто знает какое-то элегантное решение?
C# 4.0 §4.3.1
Таким образом, операторы
int i = 123;
object box = i;
будут соответствовать операторам
int i = 123;
object box = new Box<int>(i);
В действительности описанный выше класс упаковки Box<T> не существует, а динамический тип упакованного значения не является типом класса. Упакованное значение типа T имеет динамический тип T. При проверке динамического типа с помощью оператора is возможно использование ссылки на тип T. Например,
int i = 123;
object box = i;
if (box is int) {
Console.Write("Box contains an int");
}
на консоль будет выведена строка «Box contains an int».
Re[2]: как проверить целое ли число?
От:
Аноним
Дата:
13.09.11 15:00
Оценка:
вообще задача не проверить что там int упакован, а что там лежит целое число.
А число может быть как double так и decimal.
Здравствуйте, MadHuman, Вы писали:
MH>Всем привет! MH>У функции есть аргумент типа object. MH>Как определить что пришедшее значение это целое число, т.е. значение может быть любого из целых типов — int, int64, uint и т.п., а также и для случаев когда тип значений чо-то типа float, double, но само значение целое число, например 1.0. MH>т.е. важна именно суть — что значение целое число. неважно во что упаковано. MH>чо-то кроме тупого перечисления всех возможных типов решения в голову не приходит... MH>может кто знает какое-то элегантное решение?
Какая задача, такое и решение
public static bool IsNumber(this object value)
{
if (value is sbyte) return true;
if (value is byte) return true;
if (value is short) return true;
if (value is ushort) return true;
if (value is int) return true;
if (value is uint) return true;
if (value is long) return true;
if (value is ulong) return true;
if (value is decimal) return true;
return false;
}
ну или так
public static bool IsNumber(this object value)
{
decimal num;
return decimal.TryParse(aaa, NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out r)
}