我的网络应用程序处理需要大量转换为数字的字符串 - 用户经常在这些字段中添加逗号,单位(如cm,m,g,kg)和货币符号,所以我想要做的是创建一个字符串扩展方法,用于清除字段并将其转换为小数。
例如:
decimal myNumber = "15 cm".ToDecimal();
答案 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,然后尝试给定的文化。但也许有些文化使用相同的符号但不同的分隔符。
所以为了让这个真正起作用,你只有两个真正的选择: *告诉您的用户他们必须使用哪种文化格式输入其值。 *让用户有可能告诉你他们决定采用哪种文化。
获取所有可用文化的列表答案 6 :(得分:0)
回答我如何为字符串类创建扩展方法:
public static class MyStringExtensions {
public static ToDecimal(this string input) {
// ...
}
}
(并且你需要为它所使用的命名空间设置一个using语句才能使用它)