有一种将对象转换为十进制的单行方式吗?

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.

Bob*_*son 6

最好的办法是创建一个扩展方法.这是我使用的,虽然你可以调整它来返回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().

它不是一行,但它只是在使用它时的单个函数调用,而且它是非常可重用的.

编辑添加可空版本


Ser*_*rvy 4

提供一个值,它读取为双精度,否则我认为它是一个字符串

好吧,这让事情变得复杂,因为有时您需要解析它,有时则不需要。

我们要做的第一件事是检查它是否已经是 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)

  • 我真的很喜欢你的第二个答案。非常简单和优雅。 (2认同)