6

アプリで3つの10進データ形式を受け入れる必要があります。

  • 123456,78 => 123456.78
  • 123,456.78 => 123456.78
  • 123456.78 => 123456.78

特定の状況で1つの形式が使用されるとは限りません。必要なのは、指定された形式に関係なく、文字列から10進値を取得することです。

これを行うための賢い方法はありますか?

使おうとしていた

var culture = CultureInfo.CreateSpecificCulture("en-US");

しかし、これはwp7では機能しないようです。

これまで私はこれを行いました:

public static class Extensions
{

    public static decimal toDecimal(this string s)
    {
        decimal res;

        int comasCount=0;
        int periodsCount=0;

        foreach (var c in s)
        {
            if (c == ',')
                comasCount++;
            else if (c == '.')
                periodsCount++;
        }

        if (periodsCount > 1)
            throw new FormatException();
        else if(periodsCount==0 && comasCount > 1)
            throw new FormatException();

        if(comasCount==1)
        {
            // pl-PL
            //parse here
        }else
        {
            //en-US
            //parse here
        }

        return res;
    }
}
4

3 に答える 3

4

var culture = new CultureInfo("en-US");使って文化を作ってみてください。decimal.Parseそのカルチャをorに渡すとdecimal.TryParse、各カルチャのテキストが適切に解析されます。

ここで、各カルチャは失敗せずにテキストを解析する可能性がありますが、元のカルチャで表現されている方法で解析するわけではないことに注意してください。たとえばdecimal.TryParse("1000,314", NumberStyles.Number, new CultureInfo("en-US"), out result)、1000.314m ではなく、成功と 1000314m という結果になります。一方、 1000.314mdecimal.TryParse("1000,314", NumberStyles.Number, new CultureInfo("fr-FR"), out result)になります。

于 2012-08-21T00:12:37.150 に答える
2

次のようなことを試してみてください:

public static decimal ParseDecimalNumber( string s , string groupSeparators , string decimalPoints )
{
  NumberFormatInfo nfi   = (NumberFormatInfo) CultureInfo.InvariantCulture.NumberFormat.Clone() ;
  NumberStyles     style = NumberStyles.AllowLeadingWhite
                         | NumberStyles.AllowLeadingSign
                         | NumberStyles.AllowThousands
                         | NumberStyles.AllowDecimalPoint
                         | NumberStyles.AllowTrailingSign
                         | NumberStyles.AllowTrailingWhite
                         ;
  decimal          value ;
  bool             parsed = false ;

  for ( int i = 0 ; !parsed && i < groupSeparators.Length ; ++i )
  {

    nfi.NumberGroupSeparator = groupSeparators.Substring(i,1) ;

    for ( int j = 0 ; !parsed && j < decimalPoints.Length ; ++j )
    {
      if ( groupSeparators[i] == decimalPoints[j] ) continue ; // skip when group and decimal separator are identical

      nfi.NumberDecimalSeparator = decimalPoints.Substring(j,1) ;

      parsed = Decimal.TryParse( s , style , nfi , out value ) ;

    }
  }

  if ( !parsed ) throw new ArgumentOutOfRangeException("s") ;

  return value ;

}

使い方は簡単です:

string groupSeparators = "., " ;
string decimalPoints   = ".,"  ;
Decimal value = ParseDecimalNumber( someStringContainingANumericLiteral , groupSeparators , decimalPoints ) ;
于 2012-08-21T00:34:36.663 に答える
0

nullに設定された異なるTryParseへの 3 回の呼び出しでそれを行う必要があります。NumberStylesIFormatProvider

于 2012-08-20T23:48:47.463 に答える