C# 考虑货币符号的数字通用转换
假设采用以下方法:C# 考虑货币符号的数字通用转换,c#,type-conversion,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 (... 公共静态bool IsNumber(字符串编号),其中T:struct。。。 尝试 { var numberConverted=(
public static bool IsNumber<T>(string number) where T : struct ...
try
{
var numberConverted = (T) Convert.ChangeType(text, typeof(T));
return true;
}
catch (...
公共静态bool IsNumber(字符串编号),其中T:struct。。。
尝试
{
var numberConverted=(T)Convert.ChangeType(text,typeof(T));
返回true;
}
捕获(。。。
我们的想法是这样称呼它:
var number = "$1,123.00";
var numberOk = IsNumber<decimal>(number);
var number=“$1123.00”;
var numberOk=IsNumber(编号);
问题是,无论如何,我都找不到一种方法来转换.ChangeType以接受带有货币符号的数字(已尝试传递IFormatProvider
,但没有成功)
使用Convert.ChangeType
时,是否有方法指定numberstyle
,或者其他方法,允许我使用方法IsNumber
,即使要检查的字符串有货币符号
编辑2016年7月3日UTC晚上9点:
其思想是,此方法验证类型T
所需的所有内容。如果我输入一个简单的decimal.Parse
并包含NumberStyles.Currency
参数,它将不会验证number
是否为整数且不应包含小数,或者number
是否为float
和minimum和maximum值与decimal
的值不同。换句话说,在全局通用解决方案中,我无法访问类似Parse
的方法或接受numberstyle
参数的方法
这个编辑是为了解释为什么我认为这不是问题的重复。在我的特定场景中,我要求它只适用于内置的.Net类型。每个数字类型都有一个
Parse
方法,正如注释中指出的,Parse
有一个重载,它接受NumberStyles
参数。Also、 重要的是要注意,Convert.ChangeType
仅适用于内置.Net类型中非常有限的子集,正如注释中所指出的。感谢宝贵的注释
现在是可行的解决方案,我刚刚使用一些反射对IsNumber
方法进行了一些调整:
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 (...
公共静态bool IsNumber(字符串编号,NumberStyles numberStyle),其中T:struct。。。
尝试
{
var mi=typeof(T).GetMethod(“Parse”,新类型[]{typeof(string),typeof(NumberStyles)});
if(mi==null)
返回false;
var parsed=mi.Invoke(null,新对象[]{number,numberStyle});
返回true;
}
捕获(。。。
方法的调用应类似于:
var number = "$1,123.00";
var numberOk = IsNumber<decimal>(number, NumberStyles.Currency);
var number=“$1123.00”;
var numberrok=IsNumber(number,NumberStyles.Currency);
@Stijn的可能重复项我没有看到重复项,该问题特别指出将货币文本解析为十进制类型的问题,我要求的是全局解决方案(不仅仅是十进制类型),在这种情况下,我没有Parse
方法来给出NumberStyles
你并不真的相信Convert.ChangeType
一般适用于每种类型,对吗?它只支持一些系统值类型和字符串。不,它不会。请参阅和。记住,在这种情况下,活动类是string
。你真的吗我必须创建自己的方法。@IvanStoev我喜欢Microsoft Refence源代码是如何毫无疑问的(:-谢谢你启发我。无论如何,即使只有内置类型支持Convert.ChangeType
,它也能满足我的需要,如果它们都支持的话(字符串除外)有一个Parse
方法。将使用此Parse
解决方案编辑答案,因为它解决了我的问题。