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

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&lt;T&gt; 方法,即使要检查的字符串有货币符号?

编辑 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&lt;T&gt; 方法进行了一些调整:

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

【讨论】:

以上是关于考虑到货币符号的数字的通用转换的主要内容,如果未能解决你的问题,请参考以下文章

3 位货币代码到货币符号

在将iphone应用程序转换为通用应用程序时重复使用架构符号

js将人名币数字格式转换为为美元数字格式

通用数字参数

比特币标准通用算力BSCH项目介绍

WPF转换器之通用转换器