指定的转换无效。如何解决这个问题?

52

我有以下函数

public object Convert(object value)
 {
    string retVal = string.Empty;
    int oneMillion = 1000000;
    retVal = ((double)value / oneMillion).ToString("###,###,###.###");
    return retVal;
 }

我正在调用像这样的函数

var result  = Convert(107284403940);

错误:"指定的类型转换无效。"

如何修复...

注意:对象的值可以是双精度、十进制、浮点、32位和64位整数等任何类型

是否可以在运行时执行类型转换?

2个回答

101

使用Convert.ToDouble(value)而不是(double)value。它接受一个object并支持你要求的所有类型! :)

此外,你的方法在上面的代码中总是返回一个string;我建议让该方法标示出来,并给它一个更明显的名称(public string FormatLargeNumber(object value)


这将会在十进制下溢出,因为OP说值可以是十进制。 - Sanjeevakumar Hiremath
2
我不这么认为:double.MaxValue 是 1.7976931E+308,decimal.MaxValue 是 7.9228E+24。你有来源吗? - Kieren Johnstone
2
从十进制到单精度或双精度的转换是缩小转换,可能会失去精度,但不会失去转换值的大小信息。这是因为十进制是128位数字,而双精度只有64位长。 - Sanjeevakumar Hiremath
2
是的,它可能会失去精度,但不会溢出。你的解决方案行不通,因为它有可能溢出。抱歉! - Kieren Johnstone
2
同意。我取消了我的负评,我只是在考虑数字的宽度而不是大小或范围。 - Sanjeevakumar Hiremath

5
如果您需要使用double, decimal, float, integer类型,请为其选择一个可以容纳所有这些类型的类型,即decimal(128位足以处理大多数数字)。

请使用decimal.Parse(value.ToString())Convert.ToDecimal(value)代替(double)value


2
这可能会在double类型中溢出,因为OP说值可以是double类型。[128位的精度并不意味着十进制可以存储更大的值;)] - Kieren Johnstone
5
是的,非常大或非常小的小数值将会使这个解决方案溢出。本来想删除我的答案,但是我将它保留作为一个警示标志。 - Sanjeevakumar Hiremath
Convert.ToDecimal(value) - 这对我有用...谢谢 - Bhavin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接