62

目的

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

問題

これを行うためのより良い方法は何ですか?それは機能し、それはクールですが、あまりエレガントではありません。

最終的解決

Servyによって提供され た答えは期待どおりに機能し、しばらくの間その実装を使用しましたが、同僚と私はさらに良い方法を見つけたので、ここでそれを文書化します。ところで、私は最終的にこのソリューションを使用することになりました。

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

6 に答える 6

34

これはどうですか。ただし、1つの文字列値に対してのみ機能します。したがって、文字列を取得してから、またはに保存しながら変換を行う必要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();
于 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.]", ""));
}

これは、負の数をサポートし、2番目のピリオド値が見つかると停止するオプションです。これにより、有効な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 に答える