【问题标题】:C# Extension Method for String Data Type字符串数据类型的 C# 扩展方法
【发布时间】:2010-05-04 08:56:31
【问题描述】:

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

例如:

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

【问题讨论】:

  • 读完“...人们得意忘形”后,我希望我没有发帖。也许如果你问了正确的问题,而不是把货币带入等式,你可能会得到你正在寻找的答案,而不是从这个听起来真的忘恩负义中走出来。在我看来,您的问题被“带走”了。如果你真的要使用字符串操作来解析货币,祝你好运。
  • 我很抱歉冒犯了你,我非常感谢大家的意见,但是,正如帖子的标题,我正在寻找一种创建字符串扩展方法的方法,无论出于何种原因。

标签: c# string extension-methods numbers


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢。需要注意的是,对于上述实现,包含 STATIC CLASS 的扩展方法必须与扩展类在同一个 NAMESPACE 中,否则您必须包含包含扩展方法的命名空间。
  • @Jimbo:实际上建议您为扩展方法创建一个单独的命名空间并强制人们导入它们。一个原因是扩展方法可以特定于特定的业务领域;不是每个开发人员都希望看到每个扩展方法,尤其是如果你有很多。在这种情况下,一个人为的示例命名空间可能是namespace Extensions.Currency
【解决方案2】:

扩展方法的形式如下:

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

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

【讨论】:

    【解决方案3】:
      public static double ToDecimal(this string value)
            {
                ... your parsing magic
            }
    

    【讨论】:

      【解决方案4】:

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

      例子:

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

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

      【讨论】:

      • 这是读取货币,非常好,谢谢 - 但是,我想知道如何制作字符串扩展方法:P
      • @Jimbo: myNumber.ToString("C");
      【解决方案5】:

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

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

      decimal d = "ponies".ToDecimal();
      

      【讨论】:

      • Decimal.TryParse可以超载吗?谢谢
      【解决方案6】:

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

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

      在英语中,NumberFormatInfo.CurrencyDecimalSeparator 是一个点 (.),NumberFormatInfo.CurrencyGroupSeparator 是一个逗号 (,)。在德语中,情况恰恰相反。因此,您可以开始疯狂猜测用户的意思是一千二百五十还是一零四美元。

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

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

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

      【讨论】:

        【解决方案7】:

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

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

        (并且您需要对其所在的命名空间有一个 using 语句才能使用它)

        【讨论】:

          猜你喜欢
          • 2017-03-26
          • 1970-01-01
          • 2010-12-13
          • 2017-04-17
          • 2020-04-15
          • 2012-09-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多