62

客观的

对在一组数据中以数字string方式显示这样的货币数据的 a 进行排序。$1,995.94

代码

我目前正在使用下面的代码示例将string值转换为,decimal以便我可以对其进行正确排序。

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);
}

问题

有什么更好的方法来做到这一点?它有效,这很酷,但它不是很优雅。

最终解决方案

Servy 提供 的答案按预期工作,我使用了该实现一段时间,但我和一位同事找到了更好的方法,所以我在这里记录它。顺便说一句,我最终使用了这个解决方案。

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

6 回答 6

34

这个怎么样,但只适用于一个字符串值。所以你需要得到你的字符串split$然后在保存到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();
于 2013-01-04T18:03:04.857 回答
16

这是一个更简单的解决方案:

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

和单元测试:

    [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());
    }
于 2016-10-06T13:11:38.363 回答
13

这是一种与您提供的代码最相似的方法

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

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

public static decimal Parse(string input)
{
    return decimal.Parse(Regex.Match(input, @"-?\d{1,3}(,\d{3})*(\.\d+)?").Value);
}
于 2013-01-04T18:07:45.197 回答
10
decimal amount = decimal.Parse("$123,456.78",
NumberStyles.AllowCurrencySymbol |
NumberStyles.AllowThousands |
NumberStyles.AllowDecimalPoint);
于 2016-01-20T12:06:30.767 回答
1

适用于所有文化:

var d = decimal.Parse("$497.7", NumberStyles.Currency, CultureInfo.CreateSpecificCulture("us-US").NumberFormat);    

Console.WriteLine(d);
于 2020-05-26T11:01:20.037 回答
0
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);
}
于 2014-01-14T08:59:31.243 回答