将对象转换为十进制? (可以为十进制)

时间:2009-02-09 08:59:40

标签: c# .net casting nullable

如果在属性的setter中有这个:

decimal? temp = value as decimal?;

value =“90”

但是在演员表之后,temp是 null ......

进行此演员表的正确方法是什么?

5 个答案:

答案 0 :(得分:66)

只有在类型相同的情况下,取消装箱才有效!您无法取消包含不包含目标值的object。你需要的是

decimal tmpvalue;
decimal? result = decimal.TryParse((string)value, out tmpvalue) ?
                  tmpvalue : (decimal?)null;

查看该值是否可解析为decimal。如果是,则将其分配给result;否则分配null。以下代码大致相同,对于不熟悉条件运算符的人?:可能更容易理解:

decimal tmpvalue;
decimal? result = null;
if (decimal.TryParse((string)value, out tmpvalue))
    result = tmpvalue;

答案 1 :(得分:5)

你应该解析小数。但是,如果您希望在字符串不正确时将小数设为null,请使用TryParse:

decimal parsedValue;
decimal? temp = decimal.TryParse(value, out parsedValue)
                ? value
                : (decimal?)null;

通过这种方式,您可以在解析格式化的字符串时避免异常。

几乎所有原始类型都提供了从字符串转换的Parse和TryParse方法。

还建议将provider参数的文化传递给方法,以避免小数分隔符出现问题。如果你正在读取另一个系统,那么CultureInfo.InvariantCulture可能就是这样(但它不是默认的)。

bool TryParse(string s, NumberStyles style,
  IFormatProvider provider, out decimal result)

答案 2 :(得分:2)

如果您使用decimal? temp = (decimal?)value;

答案 3 :(得分:2)

如果您不想解析字符串,但希望确保收到nulldecimal或可空decimal,那么您可以执行以下操作:< / p>

public static Nullable<T> Convert<T>(object input) 
    where T : struct
{
    if (input == null)
        return null;
    if (input is Nullable<T> || input is T)
        return (Nullable<T>)input;
    throw new InvalidCastException();
}

如果你希望避免异常,你可以让它在最后一行返回null,尽管这不会区分真正的空值和坏的转换。

请注意,您必须使用“is”运算符,因为“as”运算符不适用于值类型,而不进行检查的转换可能会抛出InvalidCastException。

您也可以将其作为扩展方法:

public static class ObjectExtensions
{
    public static Nullable<T> ToNullable<T>(this object input)
        where T : struct
    {
        if (input == null)
            return null;
        if (input is Nullable<T> || input is T)
            return (Nullable<T>)input;
        throw new InvalidCastException();
    }
}

并像这样使用它:

object value = 123.45m;
decimal? dec = value.ToNullable<decimal>();

这有助于避免有关取消装箱空引用的代码合同警告。

答案 4 :(得分:1)

令人惊讶的是,旧的System.Convert.ToDecimal(myNullableDoubleBoxedInObject)可以完美地工作:

decimal? myNullableDecimal = 0.15m;
object myNullableDoubleBoxedInObject = myNullableDouble ;
decimal myDecimal = System.Convert.ToDouble(myNullableDoubleBoxedInObject);