假设以下方法:
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
是否为整数且不应包含小数,或number
是float
1}}和最小值和最大值不同于decimal
的值。换句话说,在全局通用解决方案中,我无法访问类似Parse
的方法或接受NumberStyles
参数的内容。
此编辑用于解释为什么我认为这与问题Problem parsing currency text to decimal type
无关答案 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);