2012-05-28 84 views
-4

好的人让我尝试清除最后一个itme。我有一个对象a,我想检查它的值是double,int还是string。如何不将double转换为int C#?

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

如果object a =“apple”,它应该抛出double和int。

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

+3

为什么你不能使用强制转换? – munissor

+0

为什么你不能使用演员? * –

+2

为什么你需要抛出异常? – Steve

回答

4

我认为你有一个double,如果它是一个整数并且抛出它,你想将它转换为int。这是你想要的吗?

public static int ToInt32(double val) 
{ 
    if (val % 1 != 0) 
     throw new FormatException("The value is not an integer."); 
    return Convert.ToInt32(val); 
} 
+0

'val%1!= 0'这会比你想象的要失败得多。 – leppie

+1

@leppie:如果你举了一个失败的例子,你的评论可能会更有帮助吗? – Timwi

-1

使用强制

var a = 12.34 
int integer = (int)a; 
+1

这回答问题的方式是什么?这将*在你的示例中抛出一个异常 - 它会将结果截断为12,就像OP的'Convert.ToInt32'调用一样。 –

+0

@JonSkeet你是对的,它只会在double对于整数太大时才抛出异常。 – munissor

+0

实际上没有这会抛出无效的转换异常。它不会截断,因为我们试图将较高的值转换为较低的值。 –

1
var a = 12.34; 
int c = Int32.Parse(a.ToString(), NumberStyles.Integer, 
        CultureInfo.InvariantCulture); 

这将抛出一个异常,如果该数字的字符串表示不是整数。它的文档是here

+0

不,那*不会抛出异常 - 你正在使用'Int32.TryParse'。如果你使用'Int32.Parse',它会抛出... –

+0

是精神错乱。更新为正确的方法和文档 – Rob

+0

再次部分编辑,因此我可以撤消我的downvote,部分是为了修复返回值的使用。 –

3

我怀疑aobject型的在你的榜样,真正的代码是有点像这样:

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); 
} 
+0

编辑这个问题,我可以撤消它:P – SimpleVar

+0

所以他想EXCLUDE加倍?噢,为什么不只是解释'是'运营商,让他做他想做的事? – SimpleVar

+0

@YoryeNathan我想到了这一点,我再次不确定他想要什么,例如,如果字符串是“12.5”,应该抛出还是不抛出。我会把它留给别人,虽然...... –

0

第一个Convert.Int32(double)不截断取整数部分和排除小数部分的值。 Infact它返回四舍五入的值。

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

铸造将截断值和将采取的整数部分和丢弃的小数部分。

对于你的问题

有没有通过,我将能够抛出格式 异常或东西时,我尝试转换双为int一个自定义的C#方法。 ??

Convert.ToInt32如果传递给它的值不是有效的double值,会引发异常。例如

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

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

0

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

仍然不知道为什么你想抛出一个错误...
双 - > int将工作,如果变量在int边界之间

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; 
} 

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

0

关于使用什么是

if(x is int) 
{ 
    // convert here 
} 
else 
{ 
    throw new Exception("Not an int"); 
}