как проверить целое ли число?
От: MadHuman Россия  
Дата: 10.09.11 17:52
Оценка:
Всем привет!
У функции есть аргумент типа 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>может кто знает какое-то элегантное решение?

Первое что в голову пришло


bool IsInt(object obj)
{
  return Convert.ToInt32(obj) == Convert.ToDouble(obj);
}
Re: как проверить целое ли число?
От: Sinix  
Дата: 11.09.11 05:10
Оценка:
Здравствуйте, MadHuman, Вы писали:

MH>может кто знает какое-то элегантное решение?

Элегантное решение у изначально некрасивой задачи? Почему бы не ограничиться двумя перегрузками для int/double?
Re[2]: как проверить целое ли число?
От: MadHuman Россия  
Дата: 11.09.11 07:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Первое что в голову пришло



А>
А>bool IsInt(object obj)
А>{
А>  return Convert.ToInt32(obj) == Convert.ToDouble(obj);
А>}
А>


неплохо, но если значение какой-то объект к числам никак не относящийся, то ексепшн будет, а надо false вернуть...
можно конечно в try catch обернуть, но выглядит как костыль.
и строка это не число а эта функция сконвертирует её к числу и вернет — true.
Re[2]: как проверить целое ли число?
От: MadHuman Россия  
Дата: 11.09.11 08:09
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, MadHuman, Вы писали:


MH>>может кто знает какое-то элегантное решение?

S>Элегантное решение у изначально некрасивой задачи? Почему бы не ограничиться двумя перегрузками для int/double?

потому что функция обобщённая и аргумент интерпретируется по разному в зависимости от сути значения.
Re[3]: как проверить целое ли число?
От: Sinix  
Дата: 11.09.11 08:16
Оценка:
Здравствуйте, 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 в функцию и потом в зависимости от типа принимать решение это не есть гуд.
Re: как проверить целое ли число?
От: icWasya  
Дата: 13.09.11 08:54
Оценка:
Здравствуйте, 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.
Re: как проверить целое ли число?
От: e.slyusar  
Дата: 14.09.11 02:07
Оценка:
Здравствуйте, 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)
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.