2010-05-04 66 views
2

我的web应用程序处理需要转换为数字的字符串 - 用户经常在这些字段中输入逗号,单位(如cm,m,g,kg)和货币符号,我想要做的是创建一个字符串扩展方法,清理字段并将其转换为小数。用于字符串数据类型的C#扩展方法

例如:

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

在阅读“......人被带走”后,我希望我没有发布。也许如果你问正确的问题而不是将货币带入方程式,你可能会得到你正在寻找的答案,而不是从这个听起来真的不值一提。在我看来,你被你的问题“带走”了。如果你真的打算使用字符串操作进行货币解析,祝你好运。 – spender 2010-05-04 09:16:12

+0

我很抱歉冒犯了你,我很欣赏每个人的意见,但是,由于这篇文章有权,我正在寻找的是一种创建字符串扩展方法的方法,无论出于何种原因。 – Jimbo 2010-05-05 07:17:52

回答

6

你期待不同“文化”的用户使用您的应用程序?如果是这样,最好在用户的区域设置系数:

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

或者你可以在STR替代的每一个字符不是一个数字或CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator值,然后解析它作为一个小数。

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

+0

谢谢。需要注意的是,对于上述实现,包含STATIC CLASS的扩展方法必须与扩展类位于相同的NAMESPACE中,否则您将不得不包含扩展方法所在的名称空间。 – Jimbo 2010-05-05 07:39:45

+0

@Jimbo:其实建议你为你的扩展方法创建一个单独的命名空间,并强制用户导入它们。原因之一是扩展方法可能特定于特定的业务领域;不是每个开发人员都希望看到每种扩展方法,特别是如果你有很多扩展方法的话。在这种情况下,人为的示例名称空间可以是'namespace Extensions.Currency'。 – 2010-05-05 08:37:14

1

请阅读本文关于货币实现http://msdn.microsoft.com/en-us/goglobal/bb688126.aspx

实施例:

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

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

+0

我认为Jimbo需要阅读一种货币,而不是写它。 – Oliver 2010-05-04 09:05:51

+0

这是读取货币,非常好,谢谢 - 但是,我想知道如何使字符串扩展方法无论如何:P – Jimbo 2010-05-04 09:13:38

+0

@Jimbo:myNumber.ToString(“C”); – Svisstack 2010-05-04 17:56:58

0

解决此问题的最合适的方法似乎是使用接受NumberStyles和文化的Decimal.TryParse的超负荷。通过它NumberStyles.Currency和适当的文化。现在

,没有什么能阻止你提供的扩展方法上string调用此 - 但你需要考虑你想要什么样的d值是后

decimal d = "ponies".ToDecimal(); 
+0

是否有可能重载'Decimal.TryParse'?谢谢 – Jimbo 2010-05-04 09:19:03

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

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

一个小例子是把你的电话号码改为英文或德文。

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

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

所以要真正实现这个目标,你只需要两个真正的选择: *告诉你的用户在哪种文化格式下输入他们的值。 *给予用户告诉你他们决定采用哪种文化的可能性。

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

0

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

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

(你需要有一个using语句的命名空间它位于为了使用它)

5

扩展方法是以下形式的:

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

这是用于书写扩展方法的guide