繁体   English   中英

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

[英]C# Extension Method for String Data Type

我的 web 应用程序处理需要大量转换为数字的字符串 - 用户经常在这些字段中放置逗号、单位(如 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值的每个字符,然后将其解析为十进制。

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

扩展方法的形式如下:

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

这是编写扩展方法的指南

请阅读这篇关于货币实现的文章:
https://docs.microsoft.com/en-us/globalization/locale/currency-formatting

例子:

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

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

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

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

现在,没有什么能阻止您在string上提供一个扩展方法来调用它 - 但您确实需要考虑您希望d的值之后

decimal d = "ponies".ToDecimal();

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

一个小例子是将您的号码读为英文或德文。

在英语中NumberFormatInfo.CurrencyDecimalSeparator是一个点 (.),而NumberFormatInfo.CurrencyGroupSeparator是一个逗号 (,)。 在德语中,情况正好相反。 所以你可以开始疯狂猜测用户是指一千二百五十还是一零四美元。

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

因此,要使其真正发挥作用,您只有两个真正的选择: * 告诉您的用户他们必须以哪种文化格式输入他们的价值观。 * 让用户可以告诉您他们决定采用哪种文化。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM