字符串数据类型的C#扩展方法

我的网络应用程序处理需要大量转换为数字的字符串 – 用户经常在这些字段中添加逗号,单位(如cm,m,g,kg)和货币符号,所以我想要做的是创建一个字符串扩展方法清除字段并将其转换为小数。

例如:

decimal myNumber = "15 cm".ToDecimal(); 

您是否期望不同“文化”的用户使用您的应用程序? 如果是这样,最好考虑用户的区域设置:

 static decimal ToDecimal(this string str) { return Decimal.Parse(str, CultureInfo.CurrentCulture); } 

或者您可以替换str中不是数字的每个字符或CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator值,然后将其解析为小数。

编辑:
通常认为扩展方法应该有自己的命名空间。 这将避免命名冲突并迫使最终用户有选择地导入他们需要的扩展。

扩展方法具有以下forms:

 public static class StringExtensions { public static decimal ToDecimal(this string input) { //your conversion code here } } 
  • 包含的类必须是静态的。 该方法也是静态的注意“this”关键字。 我建议按照它们引用的类型对扩展方法进行分组的约定,但没有要求这样做。

这是编写扩展方法的指南 。

请阅读这篇关于货币实施的文章http://msdn.microsoft.com/en-us/goglobal/bb688126.aspx

例:

 Double myNumber = Double.Parse("$1,250.85", NumberStyles.Any); 

PS。 您尝试将浮点值解析为十进制类型。

  public static double ToDecimal(this string value) { ... your parsing magic } 

在我看来,解决这个问题最合适的方法是使用接受NumberStyles和culture的Decimal.TryParse的重载。 传递它NumberStyles.Currency和适当的文化。

现在,没有什么可以阻止你在string上提供一个调用它的扩展方法 – 但是你需要考虑你希望d之后的值是什么

 decimal d = "ponies".ToDecimal(); 

最大的问题是您必须知道用户输入号码的文化。 否则你会遇到大问题。

一个小例子就是把你的号码读成英语或德语。

在英语中, NumberFormatInfo.CurrencyDecimalSeparator是一个点(。),而NumberFormatInfo.CurrencyGroupSeparator是一个逗号(,)。 在德国,这恰恰相反。 因此,如果用户意味着一千二百五十或一,四美元,你可以开始疯狂猜测。

也许你可以运行所有可用的Cultures并检查你的用户输入是否包含NumberFormatInfo.CurrencySymbol ,然后尝试给定的文化。 但也许有些文化使用相同的符号但不同的分隔符。

因此,要真正实现这一点,您只有两个真正的选择:*告诉您的用户他们必须输入他们的文化格式。 *让用户可以告诉您他们决定采用哪种文化。

可以通过CultureInfo.GetCultures()获取所有可用文化的列表

只是回答我如何为字符串类创建扩展方法:

 public static class MyStringExtensions { public static ToDecimal(this string input) { // ... } } 

(并且您需要为它所使用的命名空间使用using语句才能使用它)