将货币string转换为小数?
目的
对一组显示货币数据的string
sorting,例如$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
为$
,然后在保存到array
或list
同时进行转换
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); }