考虑货币符号的数字的通用转换

时间:2016-07-03 20:53:36

标签: c# type-conversion

假设以下方法:

public static bool IsNumber<T>(string number) where T : struct ...
try
{
   var numberConverted = (T) Convert.ChangeType(text, typeof(T));
   return true;
}
catch (...

这个想法是这样称呼的:

var number = "$1,123.00";
var numberOk = IsNumber<decimal>(number);

问题在于,无论如何,我都找不到Convert.ChangeType接受带有货币符号的数字的方法(已尝试传递IFormatProvider但没有成功)。

有没有办法在使用NumberStyles时指定Convert.ChangeType,或者某些不同的东西允许我使用方法IsNumber<T>,即使要检查的字符串有货币符号?

编辑Jul-3-2016 9 PM UTC:

我们的想法是,此方法会验证T类型所需的所有内容。如果我放置一个简单的decimal.Parse并包含NumberStyles.Currency参数,则不会验证number是否为整数且不应包含小数,或numberfloat 1}}和最小值和最大值不同于decimal的值。换句话说,在全局通用解决方案中,我无法访问类似Parse的方法或接受NumberStyles参数的内容。

此编辑用于解释为什么我认为这与问题Problem parsing currency text to decimal type

无关

1 个答案:

答案 0 :(得分:1)

在我的特定场景中,我要求它只能使用内置的.Net类型。每种数字类型都有Parse方法,并且在评论中Stijn指出,Parse有一个接受NumberStyles参数的重载。此外,重要的是要注意Convert.ChangeType仅适用于内置.Net类型的非常有限的子集,如评论中Ivan Stoev所指出的那样。感谢您的宝贵意见!

现在是工作解决方案,我刚刚使用一些反思对IsNumber<T>方法进行了一些调整:

public static bool IsNumber<T>(string number, NumberStyles numberStyle) where T : struct ...
try
{
    var mi = typeof(T).GetMethod("Parse", new Type[] {typeof(string), typeof(NumberStyles)});
    if (mi == null)
        return false;
    var parsed = mi.Invoke(null, new object[] {number, numberStyle});
    return true;
}
catch (...

方法应该被称为:

var number = "$1,123.00";
var numberOk = IsNumber<decimal>(number, NumberStyles.Currency);