将货币string转换为小数?

目的

对一组显示货币数据的stringsorting,例如$1,995.94数字forms显示在一组数据中。

我正在使用下面的代码示例将string值转换为decimal以便我可以正确地sorting。

 if (sortBy == "checkAmount") { StringBuilder sb = new StringBuilder(); foreach (var c in Convert.ToString(p.GetType().GetProperty(sortBy).GetValue(p, null))) { if (!char.IsDigit(c) && c != '.') { continue; } sb.Append(c); } return Convert.ToDecimal(sb.ToString()); } else { return p.GetType().GetProperty(sortBy).GetValue(p, null); } 

问题

什么是更好的方法呢? 它工作,这很酷,但它不是很优雅。

最终解决scheme

Servy提供的答案按预期工作 ,我用了一段时间的实施,但一个同事,我发现一个更好的方式,所以我在这里logging。 顺便说一句,我最终使用这个解决scheme。

 decimal.Parse(input, NumberStyles.AllowCurrencySymbol | NumberStyles.Number); 

这里有一个和你提供的代码非常相似的方法

 public static decimal Parse(string input) { return decimal.Parse(Regex.Replace(input, @"[^\d.]", "")); } 

这是一个支持负数的选项,如果find第二个周期值,它将停止,从而减less返回的string数量,这些string不是有效的decimal值。 它还有一些在OP中没有看到的其他修改来处理当前代码不支持的其他情况。

 public static decimal Parse(string input) { return decimal.Parse(Regex.Match(input, @"-?\d{1,3}(,\d{3})*(\.\d+)?").Value); } 

如何呢,但只适用于一个string值。 所以你需要把你的stringsplit$ ,然后在保存到arraylist同时进行转换

  using System.Globalization; //rest of your code string str = "$50,550.20"; decimal decval; bool convt = decimal.TryParse(str, NumberStyles.Currency, CultureInfo.CurrentCulture.NumberFormat, out decval); if (convt) Console.WriteLine(decval); Console.ReadLine(); 
 decimal amount = decimal.Parse("$123,456.78", NumberStyles.AllowCurrencySymbol | NumberStyles.AllowThousands | NumberStyles.AllowDecimalPoint); 

这是一个更简单的解决scheme:

  public static decimal ToDecimal(this string str) { return decimal.Parse(str, NumberStyles.Currency); } 

和unit testing:

  [Test] public void ToDecimal_Convert_String_To_Decimal() { Assert.AreEqual(1234M, "1234".ToDecimal()); Assert.AreEqual(-1234.56M, "$(1,234.56)".ToDecimal()); Assert.AreEqual(1234.56M, "$1,234.56".ToDecimal()); } 
 public static decimal ToDecimalFromStringDecimalOrMoneyFormattedDecimal(this string s) { try { return decimal.Parse(s); } catch { var numberWithoutMoneyFormatting = Regex.Replace(s, @"[^\d.-]", ""); return decimal.Parse(numberWithoutMoneyFormatting); } } [Test] public void Test_ToDecimalFromStringDecimalOrMoneyFormattedDecimal() { Assert.That("$ 500".ToDecimalFromStringDecimalOrMoneyFormattedDecimal() == (decimal)500); Assert.That("R -500".ToDecimalFromStringDecimalOrMoneyFormattedDecimal() == (decimal)-500); Assert.That("-$ 500".ToDecimalFromStringDecimalOrMoneyFormattedDecimal() == (decimal)-500); Assert.That("P 500.90".ToDecimalFromStringDecimalOrMoneyFormattedDecimal() == (decimal)500.9); Assert.That("$ -50 0,090,08.08".ToDecimalFromStringDecimalOrMoneyFormattedDecimal() == (decimal)-50009008.08); }