考虑到货币符号的数字的通用转换
Posted
技术标签:
【中文标题】考虑到货币符号的数字的通用转换【英文标题】:Generic conversion of numbers taking into account the currency symbol 【发布时间】:2016-07-03 20:53:36 【问题描述】:假设如下方法:
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
,但没有成功)。
有没有办法在使用Convert.ChangeType
时指定NumberStyles
,或者有什么不同的方法可以让我使用IsNumber<T>
方法,即使要检查的字符串有货币符号?
编辑 2016 年 7 月 3 日晚上 9 点 UTC:
这个想法是这个方法验证类型T
需要的所有东西。如果我输入一个简单的decimal.Parse
并包含一个NumberStyles.Currency
参数,它不会验证number
是一个整数并且不应该有小数,或者number
是一个float
,并且最小值和最大值是与decimal
的不同。换句话说,在全局和通用解决方案中,我无法访问类似 Parse
的方法或接受 NumberStyles
参数的方法。
这个编辑是为了解释为什么我认为这不是问题Problem parsing currency text to decimal type的重复
【问题讨论】:
Problem parsing currency text to decimal type的可能重复 @Stijn 我没有看到重复,该问题明确指出 将货币文本解析为 十进制 类型的问题,我要求一个全球解决方案(不是专门的十进制类型),在这种情况下我没有Parse
方法来给出NumberStyles
你不会真的相信Convert.ChangeType
对所有类型都通用,对吧?它只支持一些系统值类型和字符串。
不,不会。请参阅 here 和 here。请记住,本例中的活动类是string
。您确实必须制定自己的方法。
@IvanStoev 我喜欢 Microsoft 参考源如何不容置疑(: - 感谢您启发我。无论如何,即使仅支持 Convert.ChangeType
的内置类型,它也足以满足我的需求, 其中所有(字符串除外)都有Parse
方法的情况。将使用此Parse
解决方案编辑答案,因为它解决了我的问题。
【参考方案1】:
在我的特定场景中,我要求它仅适用于内置的 .Net 类型。每个数字类型都有一个 Parse
方法,正如 cmets 中的 Stijn 所指出的,Parse
有一个接受 NumberStyles
参数的重载。此外,重要的是要注意 Convert.ChangeType
仅适用于非常有限的内置 .Net 类型子集,正如 cmets 中的 Ivan Stoev 所指出的那样。感谢宝贵的 cmets!
现在是可行的解决方案,我刚刚使用一些反射对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);
【讨论】:
以上是关于考虑到货币符号的数字的通用转换的主要内容,如果未能解决你的问题,请参考以下文章