-4

好的,人们让我尝试清除最后一个项目。我有一个对象 a,我想检查它的值是 double、int 还是 string。

例如: - 如果对象 a = "12.3" 或 a = 12.3,它应该能够在转换为 int 的同时转换为 double 和 throw。如果对象 a = "12" 或 a = 12 或 a = 12.0,它应该能够转换为 int 并在转换为 double 时抛出。

如果 object a="apple" 它应该为 double 和 int 抛出。

希望这次我清楚。但 Timwi 的解决方案实际上为我解决了这个问题。:-)

4

8 回答 8

4

我认为你有一个双精度数,如果它是一个整数,你想将它转换为 int,否则抛出。这是你想要的吗?

public static int ToInt32(double val)
{
    if (val % 1 != 0)
        throw new FormatException("The value is not an integer.");
    return Convert.ToInt32(val);
}
于 2012-05-28T19:14:01.257 回答
3

我怀疑这a是你的例子中的类型object,真正的代码有点像这样:

int myToInt(object a)
{
    return Convert.ToInt32(a);
}

但是如果a是整数,您希望它抛出。那么这个怎么样:

int myToInt(object a)
{
    if (a is double)
        throw new ArgumentException("a", "Must not be a double");
    return Convert.ToInt32(a);
}
于 2012-05-28T19:05:11.490 回答
1
var a = 12.34;
int c = Int32.Parse(a.ToString(), NumberStyles.Integer,
                    CultureInfo.InvariantCulture);

如果数字的字符串表示不是整数,这将引发异常。它的文档在这里

于 2012-05-28T18:58:40.893 回答
1

既然我们都在猜测 OP 想要什么,我会再试一次。假设您想要一个当且仅当值被截断时抛出的方法,请尝试以下操作:

int MyToInt32(double value)
{
    if (value != Math.Floor(value))
        throw new ArgumentException("value", "The value must not have a fractional part");
    return (int) value;
}

但这可能是一个相当糟糕的主意。

于 2012-05-28T19:11:55.410 回答
0

首先Convert.Int32(double)不会截断取整数部分但不包括小数部分的值。事实上,它返回四舍五入的值。

值,四舍五入到最接近的 32 位有符号整数。如果 value 在两个整数的中间,则返回偶数;即4.5转换为4,5.5转换为6。

强制转换将截断该值并将取整数部分并丢弃小数部分。

对于你的问题

当我尝试将 double 转换为 int 时,是否有一个自定义的 c# 方法可以抛出格式异常或其他东西。??

Convert.ToInt32如果传递给它的值不是有效的双精度值,则会抛出异常。例如

 var val = "12.54A";
 int iVal = Convert.ToInt32(val);

而如果你尝试使用 int iVal = (int) val; 会给你编译错误。

于 2012-05-28T19:05:20.303 回答
0

你能试试用数学吗?您可以尝试为 double 添加一些值,以确保它比 int 更大(或更小)。
然后尝试转换(这将返回错误)和相反的数学函数。

仍然不知道为什么要抛出错误...
Double -> int 将起作用,如果变量位于 int-borders 之间

于 2012-05-28T19:11:54.443 回答
0

使用的是什么

if( x is int )
{
    // convert here
}
else
{
    throw new Exception("Not an int");
}
于 2012-05-28T19:21:45.330 回答
-1

使用演员表

var a = 12.34
int integer = (int)a;
于 2012-05-28T18:54:29.320 回答