将字符串转换为小数? (可空小数)通过扩展方法

时间:2014-10-03 13:35:36

标签: c# generics

我想将字符串转换为小数?参考上一个问题here

其中一个答案给出了一个对象扩展来转换像这样的对象

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>();

以上不适用于字符串,是否可以定义上述方法的伴侣来专门处理字符串?

特别喜欢我想做的事情: -

object v1 = 123.45m;
decimal? d1 = v1.ToNullable<decimal>();

object v2 = "123.45";
decimal? d2 = v2.ToNullable<decimal>();

4 个答案:

答案 0 :(得分:3)

一个简单的扩展方法将字符串转换为十进制。当然不是空字符串

public static class StringExtensions
{
   public static decimal? ToNullableDecimal(this string s)
   {
      decimal value;
      if (!Decimal.TryParse(s, out value)
         return null;
      return value;
   }
}

答案 1 :(得分:2)

你可以这样做:

string nds = null;
decimal? d = (nds != null) ? Convert.ToDecimal(nds) : default(decimal?);

答案 2 :(得分:2)

鉴于你的扩展功能,为什么不能这样:

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;
            else if (input is string)
                return (T)Convert.ChangeType(input, typeof(T));

            throw new InvalidCastException();
        }
    }

它适用于数字类型(由ChangeType支持),甚至是Dates等。

当然,&#34;输入&#34;必须可转换为所需类型(谨防特定于文化的约束)。

为了改善这一点,您可以传递给&#34; ChangeType&#34; (在第三个参数)您要使用的文化,例如return ((T)Convert.ChangeType(input, typeof(T), new CultureInfo("en-US")));

您还可以在此方法中添加内容以处理异常等

答案 3 :(得分:0)

这对我有用吗

1-在类中创建以下方法(ex ValidationHelper)

     public static decimal? Todecimal(string s,decimal defValue=0)
    {
        if (s.Trim()!="")
        {
            return Convert.ToDecimal(s);
        }
        else
        {
            return defValue;
        }
    }

然后你可以在你的应用中的任何地方使用它

prod.Qty = ValidationHelper.Todecimal(txtQty.Text,1);//ex: assuming the default value for Qty is 1. 

希望这会对某人有所帮助。感谢