C# 当输入为Null时,将解析处理为Float

C# 当输入为Null时,将解析处理为Float,c#,C#,我想解析一个要浮动的字符串。当字符串为null时,它将传递0(作为浮点值) 我是这样做分析的: aeVehicle.MSRP = float.Parse((drInvetory["MSRP"] ?? "0").ToString()); 其中给出了错误: ERROR MESSAGE : Input string was not in a correct format. ERROR SOURCE : at System.Number.StringToNumber(String str, Nu

我想解析一个要浮动的字符串。当字符串为null时,它将传递0(作为浮点值)

我是这样做分析的:

aeVehicle.MSRP = float.Parse((drInvetory["MSRP"] ?? "0").ToString());
其中给出了错误:

ERROR MESSAGE : Input string was not in a correct format.
ERROR SOURCE :    at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   at System.Number.ParseSingle(String value, NumberStyles options, NumberFormatInfo numfmt)
   at System.Single.Parse(String s, NumberStyles style, NumberFormatInfo info)
   at System.Single.Parse(String s)
请建议处理这种情况的最佳方法。

如果
drInvetory[“MSRP”]
来自
DataRow
,则与
DBNull
相比,null合并运算符的计算结果将不为true,因此浮点分析将失败。您可以比较
DBNull.Value
,或者使用
float.TryParse()

float f = 0f;
string s = (drInvetory["MSRP"] ?? "0").ToString();
if (s != null) {
    f = float.Parse(s, ...
}
源于原始代码

aeVehicle.MSRP = float.Parse(drInvetory["MSRP"] == DBNull.Value ? "0" : drInvetory["MSRP"].ToString());
aeVehicle.MSRP = drInvetory["MSRP"] == DBNull.Value ? default( float ) : 
(float)drInvetory["MSRP"];
就我个人而言,我会检查
DBNull
,然后将其转换为浮点型(或者将其解压为精确类型,然后转换)。这节省了相对昂贵的字符串分析

更好

aeVehicle.MSRP = float.Parse(drInvetory["MSRP"] == DBNull.Value ? "0" : drInvetory["MSRP"].ToString());
aeVehicle.MSRP = drInvetory["MSRP"] == DBNull.Value ? default( float ) : 
(float)drInvetory["MSRP"];
SQL-CLR类型映射:

另请参见:

您应该使用TryParse:

    float num = 0;
    float.TryParse(s, out num);

它可能是由字符串中意外的逗号引起的。试着先扔掉逗号

float result = 0;
float.TryParse(drInvetory["MSRP"], out result);
aeVehicle.MSRP = result;

这样,如果解析失败,它将始终返回到0。

另一个简单的替代方法是:

aeVehicle.MSRP = float.Parse("0" + drInvetory["MSRP"].ToString());
它只适用于正数。
否则,请使用最方便的Microsoft.VisualBasic.Val函数。

0.0
是一个
double
0f
会更好,或者干脆
0
。谢谢-今天来到了Java世界(没有借口,0.0在Java中也是双倍的)。为什么ToString()?它已经是一个字符串了。s不能为null,因此if似乎不是必需的。如果drInvetory[“MSRP”]不是字符串,我想这不会编译。我从来不知道这一点。是的。它来自一个字符串DataRow@Tim梅多拉..我仔细检查了这个..你是对的..你今天教了我一件很棒的事情..谢谢你的提问似乎drInvetory[“MSRP”]返回字符串。如果是这样,这将抛出一个异常:(float)drInvetory[“MSRP”]。最好使用Convert.ToSingle()@Petar no,它返回
object
<代码>对象可以与
字符串
合并为空-结果是一个
对象
表达式;然后,现有代码调用
.ToString()
进行
解析。有了这些信息,我们真的无法对什么是
drInvetory[“MSRP”]
做出任何假设。如果它实际上是一个盒装的
浮点值
,那么我同意“更好”。如果它实际上是一个字符串,碰巧有一个数值,那么在sql server中,
Parse
“MSRP”字段是“Money”类型。我获取这个数据并将其存储在数据表中。