web-dev-qa-db-ja.com

文字列をフォーマット付きの10進数に変換する

C#で文字列を10進数に変換する必要がありますが、この文字列の形式は異なります。

例えば:

「50085」

「500,85」

「500.85」

これは、10進数で500,85に変換する必要があります。フォーマットを使用してこの変換を行う簡略化されたフォームはありますか?

Decimal.Parse()は探しているメソッドですが、もう少し情報を提供する必要があります。指定した3つの形式の間で自動的に選択されるわけではないので、(IFormatProviderの形式で)期待する形式を指定する必要があります。 IFormatProviderを使用しても、「50085」が適切に引き込まれるとは思わないことに注意してください。

私が見る唯一の一貫したことは、常に小数点以下2桁の精度を期待しているように見えることです。その場合は、すべてのピリオドとコンマを取り除いてから、100で除算できます。

多分次のようなもの:

public decimal? CustomParse(string incomingValue)
{
    decimal val;
    if (!decimal.TryParse(incomingValue.Replace(",", "").Replace(".", ""), NumberStyles.Number, CultureInfo.InvariantCulture, out val))
        return null;
    return val / 100;
}
17
Chris Shaffer

一部のカルチャでは、浮動小数点を示すためにコンマを使用しています。これは、aspxページで次のコードを使用してテストできます。

var x = decimal.Parse("500,85");
Response.Write(x + (decimal)0.15);

これは、スレッドカルチャが浮動小数点としてコンマを使用するカルチャに設定されている場合に、回答501を示します。次のように強制できます。

var x = decimal.Parse("500,85", new NumberFormatInfo() { NumberDecimalSeparator = "," });
18
James McCormack

これは、文化の設定に応じて機能します。

string s = "500.85";
decimal d = decimal.Parse(s);

カルチャがデフォルトで小数点として,ではなく.を許可していない場合は、おそらく次のようにする必要があります。

s = s.Replace(',','.');

しかし、複数の.をチェックする必要があります...これは、入力のサニタイズの問題の多くに要約されるようです。入力を検証およびサニタイズしてすべてが一連のルールに準拠できる場合、10進数への変換ははるかに簡単になります。

6
Jaymz

以下のコードを試してください:

string numValue = "500,85";
System.Globalization.CultureInfo culInfo = new System.Globalization.CultureInfo("fr-FR");
decimal decValue;
bool decValid = decimal.TryParse(numValue, System.Globalization.NumberStyles.Number, culInfo.NumberFormat, out decValue);
if (decValid)
{
    lblDecNum.Text = Convert.ToString(decValue, culInfo.NumberFormat);
}

500,85の値を指定しているので、カルチャはフランス語であり、したがって小数点記号は ", "。次に、decimal.TryParse(numValue、System.Globalization.NumberStyles.Number、culInfo.NumberFormat、out decValue);は、値を500.85としてdecValueに返します。同様に、ユーザーが英語(米国)の場合は、culInfoコンストラクターを変更します。

3
Nisha_Roy

多くの方法があります:

  1. System.Convert.ToDecimal("232.23")
  2. Double.Parse("232.23")
  3. _double test;_ Double.TryParse("232.23", out test)

ぜひお試しください...

1

これはDigit Grouping Symbolと呼ばれる新機能です。

手順:

  1. コントロールパネルで地域と言語を開く
  2. 追加設定をクリックします
  3. 数字タブ
  4. カスタム設定としてDigit Grouping Symbolを設定します。カンマを変更します。に置き換えます(AからZまたは{/、}としての任意の文字)。桁区切り記号= e;

例:

string checkFormate = "123e123";
decimal outPut = 0.0M;
decimal.TryParse(checkFormate, out outPut);
Ans: outPut=123123;
1
Mohd Vasil

これを試して

 public decimal AutoParse(string value)
    {
        if (Convert.ToDecimal("3.3") == ((decimal)3.3))
        {
            return Convert.ToDecimal(value.Replace(",", "."));
        }
        else
        {
            return Convert.ToDecimal(value.Replace(".", ","));
        }

    }
0
halo89