将货币字符串转换为小数?

Mik*_*oud 47 .net c# type-conversion

目的

排序string是显示这样的货币数据$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);
}
Run Code Online (Sandbox Code Playgroud)

问题

有什么更好的方法呢?它有效,而且很酷,但它不是很优雅.

最终解决方案

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

decimal.Parse(input, NumberStyles.AllowCurrencySymbol | NumberStyles.Number);
Run Code Online (Sandbox Code Playgroud)

bon*_*igo 26

怎么样,但只适用于一个字符串值.所以,你需要得到您的字符串split通过$,然后进行转换,同时节省成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();
Run Code Online (Sandbox Code Playgroud)

  • @bonCodigo你真正找到了处理货币的正确方法.虽然它没有完全模仿OPs方法*但它显示了正确的方法.OPs示例"接受"格式错误的货币值,例如`$ 1995.,94`,甚至`$ abc.123,456`.没有*标准*方法将这些字符串解释为数字,这就是为什么有一个内置的解析货币标准的原因.+1 (4认同)

Ser*_*rvy 12

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

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

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

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

  • 当心这个解决方案,尤其是第二部分。它不能处理所有情况,如果输入是 -5000,它会评估为 -500,则存在严重错误。 (2认同)

bil*_*lal 9

decimal amount = decimal.Parse("$123,456.78",
NumberStyles.AllowCurrencySymbol |
NumberStyles.AllowThousands |
NumberStyles.AllowDecimalPoint);
Run Code Online (Sandbox Code Playgroud)

  • 提供对答案元素的解释以及为什么它更好更优雅会使这个答案变得更好. (5认同)

Red*_*Red 8

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

    public static decimal ToDecimal(this string str)
    {
        return decimal.Parse(str, NumberStyles.Currency);
    }
Run Code Online (Sandbox Code Playgroud)

和单元测试:

    [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());
    }
Run Code Online (Sandbox Code Playgroud)