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

时间:2010-05-04 08:56:31

标签: c# string extension-methods numbers

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

例如:

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

7 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:5)

扩展方法具有以下形式:

public static class StringExtensions
{
    public static decimal ToDecimal(this string input)
    {
        //your conversion code here
    }
}
  • 包含的类必须是静态的。 该方法也是静态注意 “这个”关键字。我推荐 分组扩展的惯例 方法按他们的类型 参考,但没有要求 这样做。

这是一个用于编写扩展方法的guide

答案 2 :(得分:1)

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

示例:

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

现在,没有什么可以阻止您在string上提供一种调用此方法的扩展方法 - 但您需要考虑您希望d之后的值

decimal d = "ponies".ToDecimal();

答案 5 :(得分:0)

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

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

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

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

所以为了让这个真正起作用,你只有两个真正的选择: *告诉您的用户他们必须使用哪种文化格式输入其值。 *让用户有可能告诉你他们决定采用哪种文化。

可以通过CultureInfo.GetCultures()

获取所有可用文化的列表

答案 6 :(得分:0)

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

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

(并且你需要为它所使用的命名空间设置一个using语句才能使用它)