在 C# 中,我如何将对象转换为浮点数
In c# how i can convert from object to float
尝试将对象转换为浮点数时出现以下错误:
System.InvalidCastException: The cast specified is invalid.
menu[i].weight = (float)dataGridView1[j, i].Value;
您可以使用 float.TryParse
并将对象转换 ToString()
作为参数传递。请看下面。
object obj = 2.111;
float height;
if (float.TryParse(obj.ToString(), out height))
{
//success
Console.WriteLine(height);
}
else
{
//failed
}
正如其他人在评论中所述,您正在转换的值并不是真正的 float
- 但这可能会造成混淆,因为 它可能看起来像 a float
- 这是一个可能的场景示例:
object maybeFloat = 1.25; // looks like a float, but is actually a double!
float wontWork = (float)maybeFloat;
上面的转换将失败,抛出一个 InvalidCastException
- 因为实际存储的项目(在 C# 中技术上称为 boxed,在 struct
s,例如 int
、float
、double
,以及自定义 struct
类型)是 double
,而不是 float
。有几个“修复”:
- 存储一个浮点数:
object someFloat = 1.25f; // Notice the `f` after the number - that's a float!
float willWork = (float)someFloat;
...但这并不总是可能的 - 数据可能来自某些外部来源,例如数据库等。在这种情况下,float.Parse
来拯救:
object maybeFloat = 1.25; // Still not a float... but can be parsed as one!
float willWork = float.Parse(maybeFloat.ToString()); // float.Parse requires a string,
// hence the `.ToString()` call
如果对象包含一个实际上可解析为 float
数据类型的值,这将起作用。因此,上面的示例适用于将装箱的 double
解析为 float
(注意,可能会发生一些数据丢失 - 不是在上面的示例中,但一般来说,因为 float
是一个较小的数据类型比 double
)。如果存储的值是 string
(顺便说一句,string
未装箱,因为它们是引用类型),这也将起作用。也许奇怪的是,仍然需要 .ToString()
调用 - 因为没有 隐式转换 从 object
到 string
:
object maybeFloat = "1.25"; // Still not a float... but can be parsed as one!
float willWork = float.Parse(maybeFloat.ToString()); // no implicit conversion,
// hence the `.ToString()` call
...但是如果存储的值真的、真的根本不是浮点数怎么办?好吧,然后 float.Parse
将失败,很可能会抛出 FormatException
,表明提供的值实际上无法解析为 float
数据类型。您可以使用 try/catch
块捕获异常:
object maybeFloat = "one point two five"; // hmmm... that won't parse into a float!
float result = default;
try
{
result = float.Parse(maybeFloat.ToString());
}
catch (FormatException _)
{
// Handle error here!
}
...但是,还有更好的方法 - float.TryParse
:
object maybeFloat = "one point two five"; // will fail to parse!
bool isSuccessfullyParsed = float.TryParse(maybeFloat.ToString(), out var result);
if (!isSuccessfullyParsed)
{
// Handle error
}
else
{
// `result` will contain the properly parsed float value
}
好的,这应该可以让您很好地了解您的具体情况。最后请注意,所有 .NET 数字类型都存在 .Parse
和 .TryParse
方法 - int
、long
、float
、double
、decimal
,甚至 BigInteger
- 所以同样的技术适用于所有这些。
尝试将对象转换为浮点数时出现以下错误:
System.InvalidCastException: The cast specified is invalid.
menu[i].weight = (float)dataGridView1[j, i].Value;
您可以使用 float.TryParse
并将对象转换 ToString()
作为参数传递。请看下面。
object obj = 2.111;
float height;
if (float.TryParse(obj.ToString(), out height))
{
//success
Console.WriteLine(height);
}
else
{
//failed
}
正如其他人在评论中所述,您正在转换的值并不是真正的 float
- 但这可能会造成混淆,因为 它可能看起来像 a float
- 这是一个可能的场景示例:
object maybeFloat = 1.25; // looks like a float, but is actually a double!
float wontWork = (float)maybeFloat;
上面的转换将失败,抛出一个 InvalidCastException
- 因为实际存储的项目(在 C# 中技术上称为 boxed,在 struct
s,例如 int
、float
、double
,以及自定义 struct
类型)是 double
,而不是 float
。有几个“修复”:
- 存储一个浮点数:
object someFloat = 1.25f; // Notice the `f` after the number - that's a float!
float willWork = (float)someFloat;
...但这并不总是可能的 - 数据可能来自某些外部来源,例如数据库等。在这种情况下,float.Parse
来拯救:
object maybeFloat = 1.25; // Still not a float... but can be parsed as one!
float willWork = float.Parse(maybeFloat.ToString()); // float.Parse requires a string,
// hence the `.ToString()` call
如果对象包含一个实际上可解析为 float
数据类型的值,这将起作用。因此,上面的示例适用于将装箱的 double
解析为 float
(注意,可能会发生一些数据丢失 - 不是在上面的示例中,但一般来说,因为 float
是一个较小的数据类型比 double
)。如果存储的值是 string
(顺便说一句,string
未装箱,因为它们是引用类型),这也将起作用。也许奇怪的是,仍然需要 .ToString()
调用 - 因为没有 隐式转换 从 object
到 string
:
object maybeFloat = "1.25"; // Still not a float... but can be parsed as one!
float willWork = float.Parse(maybeFloat.ToString()); // no implicit conversion,
// hence the `.ToString()` call
...但是如果存储的值真的、真的根本不是浮点数怎么办?好吧,然后 float.Parse
将失败,很可能会抛出 FormatException
,表明提供的值实际上无法解析为 float
数据类型。您可以使用 try/catch
块捕获异常:
object maybeFloat = "one point two five"; // hmmm... that won't parse into a float!
float result = default;
try
{
result = float.Parse(maybeFloat.ToString());
}
catch (FormatException _)
{
// Handle error here!
}
...但是,还有更好的方法 - float.TryParse
:
object maybeFloat = "one point two five"; // will fail to parse!
bool isSuccessfullyParsed = float.TryParse(maybeFloat.ToString(), out var result);
if (!isSuccessfullyParsed)
{
// Handle error
}
else
{
// `result` will contain the properly parsed float value
}
好的,这应该可以让您很好地了解您的具体情况。最后请注意,所有 .NET 数字类型都存在 .Parse
和 .TryParse
方法 - int
、long
、float
、double
、decimal
,甚至 BigInteger
- 所以同样的技术适用于所有这些。