Convert currency string to decimal?

后端 未结 6 913
北恋
北恋 2020-12-05 13:00

Objective

Sort a string that is displaying currency data like this $1,995.94 numerically in a set of data.

Code

I\'m cu

相关标签:
6条回答
  • 2020-12-05 13:07
    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);
    }
    
    0 讨论(0)
  • 2020-12-05 13:09
    decimal amount = decimal.Parse("$123,456.78",
    NumberStyles.AllowCurrencySymbol |
    NumberStyles.AllowThousands |
    NumberStyles.AllowDecimalPoint);
    
    0 讨论(0)
  • 2020-12-05 13:12

    Here is a simpler solution:

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

    and the unit test:

        [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());
        }
    
    0 讨论(0)
  • 2020-12-05 13:22

    works for all culture:

    var d = decimal.Parse("$497.7", NumberStyles.Currency, CultureInfo.CreateSpecificCulture("us-US").NumberFormat);    
    
    Console.WriteLine(d);
    
    0 讨论(0)
  • 2020-12-05 13:24

    Here is a method that most closely resembles the code you've provided

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

    Here is an option that will support negative numbers, and will stop if it finds a second period value, thus reducing the number of strings it returns that are not valid decimal values. It also has a few other modifications not seen in the OP to handle additional cases your current code doesn't.

    public static decimal Parse(string input)
    {
        return decimal.Parse(Regex.Match(input, @"-?\d{1,3}(,\d{3})*(\.\d+)?").Value);
    }
    
    0 讨论(0)
  • 2020-12-05 13:28

    How about this, but only works for one string value. So you need to get your string split by $ and then do the conversion while saving into the array or 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();
    
    0 讨论(0)
提交回复
热议问题