Rac*_*hel 6 c# casting decimal
是否有将decimal?数据类型转换为对象的单行方式?
我的代码看起来像这样:
foreach(DataRow row in dt.Rows)
{
var a = new ClassA()
{
PropertyA = row["ValueA"] as decimal?,
PropertyB = row["ValueB"] as decimal?,
PropertyC = row["ValueC"] as decimal?
};
// Do something
}
Run Code Online (Sandbox Code Playgroud)
但是,将对象转换为a decimal?不会按照我期望的方式工作,并且每次都返回null.
从Excel文件中读取数据行,因此每行中对象的数据类型double如果有值则为a,string如果为空则为null .
执行此强制转换的建议方法是使用decimal.TryParse,但是我不想为类上的每个小数属性创建临时变量(我的实际类中有大约7个属性是小数,而不是3).
decimal tmpvalue;
decimal? result = decimal.TryParse((string)value, out tmpvalue) ?
tmpvalue : (decimal?)null;
Run Code Online (Sandbox Code Playgroud)
有没有办法可以将一个潜在的空值转换为decimal?一行?
我尝试了这里发布的答案,但它似乎没有起作用,也给了我一个null价值,因为row["ValueA"] as string回报null.
最好的办法是创建一个扩展方法.这是我使用的,虽然你可以调整它来返回decimal?.
public static class ObjectExtensions
{
public static decimal ToDecimal(this object number)
{
decimal value;
if (number == null) return 0;
if (decimal.TryParse(number.ToString().Replace("$", "").Replace(",", ""), out value))
return value;
else
return 0;
}
public static decimal? ToNullableDecimal(this object number)
{
decimal value;
if (number == null) return null;
if (decimal.TryParse(number.ToString().Replace("$", "").Replace(",", ""), out value))
return value;
else
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以通过调用.ToDecimal()任何对象来使用它,就像调用它一样.ToString().
它不是一行,但它只是在使用它时的单个函数调用,而且它是非常可重用的.
编辑添加可空版本
提供一个值,它读取为双精度,否则我认为它是一个字符串
好吧,这让事情变得复杂,因为有时您需要解析它,有时则不需要。
我们要做的第一件事是检查它是否已经是 adouble并强制转换它,因为强制转换比解析便宜得多;解析是昂贵的。
鉴于这个逻辑并不简单,它属于它自己的方法:
public static deciaml? getDecimal(object rawValue)
{
decimal finalValue;
double? doubleValue = rawValue as double?;
if(doubleValue.HasValue)
return (decimal) doubleValue.Value;
else if(decimal.TryParse(rawValue as string, out finalValue))
{
return finalValue;
}
else
{
return null;//could also throw an exception if you wanted.
}
}
Run Code Online (Sandbox Code Playgroud)
如果您知道它始终是双精度值,并且您永远不需要字符串值,那么就更容易了。在这种情况下,您需要首先将其转换为双精度型,因为这是它的实数类型,然后您可以轻松地将其转换为十进制:
PropertyA = (decimal?)(row["ValueA"] as double?);
Run Code Online (Sandbox Code Playgroud)