1

mystringユーザーが入力する文字列があります。有効な小数であることを確認します。

decimal val;
bool validDecimal = decimal.TryParse(mystring, out val);
if (!validDecimal)
   isvalid = false;

しかし、これは私が行う必要がある唯一の検証ではありません。また、この小数が小数点以下2桁以下に指定されていることを確認する必要があります

それで、

23, 23.1, 23.45

すべて有効です

しかし

23.345, 23.450

そうではありません。

これを行うための最良の方法は何ですか?

4

5 に答える 5

2

文字列の解析はどうですか。

static bool LessThan2DecimalPlaces(string mystring, out decimal val)
{
    bool validDecimal = decimal.TryParse(mystring, out val);
    if (!validDecimal)
    {
       return false;
    }

   var index = mystring.LastIndexOf(NumberFormatInfo.CurrentInfo.NumberDecimalSeparator);
   if(index == -1)
   {
       return true;
   }
   return mystring.Substring(index).Count() < 3
}
于 2012-06-14T10:35:35.107 に答える
2

正規表現を使用して、元の文字列を検証できます。

Regex.Match(string.Format(@"^\d*({0}\d\d?)?$", CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator), mystring)
于 2012-06-14T10:46:17.500 に答える
1

許可されていないため23.450、生成される数はと同じ23.45ですが、数自体をテストすることはできません。

代わりに、文字列をテストする必要があります。

decimal val = 0m;
isvalid = isvalid &&
  Regex(@"^\d+(\.\d{1,2})?$").IsMatch(mystring) &&
  decimal.TryParse(mystring, out val);

私は初期化のアプローチを取っているvalので、到達しない問題は発生せず、現在trueTryParseの場合にのみテストを実行します。ただし、isvalid一部の操作がすでにfalseの場合、操作全体が続行を拒否すると想定します。他の理由。もちろん、バリエーションも可能です。

の前に許可される文字数も制限している場合は、ではなく.を使用できますが、データ型に対して大きすぎる数の場合を処理するため、そのままにしておきます。ParseTryParsedecimal

編集:

私が使用した正規表現をさらに詳しく見る価値があります。

^文字列の先頭に \d+一致する1つ以上の数字 .に一致する. \d{1,2}1つまたは2つ の数字に(\.\d{1,2})?一致する一致する.後に1つまたは2つの数字が一致するか、空の文字列 $が文字列の終わりに一致する

つまり、^\d+(\.\d{1,2})?$文字列全体が1桁以上、または1桁以上の.後に1桁または2桁が続く必要があることを意味します。

于 2012-06-14T10:48:47.800 に答える
0
var decimalpos = mystring.ToString().Contains(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator) ? mystring.ToString().IndexOf(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator) : 0;
   int numberofdecimals 
if decimalpos >0 then    
{
 numberofdecimals = mystring.ToString().Substring(decimalpos,mystring.ToString().Length)
}

if numberofdecimals > 2 then False else True
于 2012-06-14T10:40:37.473 に答える
0

Decimal.GetBitsを確認してください。

返される配列の4番目の要素には、スケール係数と符号が含まれています。次の部分で構成されています。

..。

ビット16〜23には、0〜28の指数が含まれている必要があります。これは、整数を除算するための10の累乗を示します。

これは機能します。

public int PlacesSpecified(decimal d)
{
    var lastInt = decimal.GetBits(d)[3];
    return (lastInt >> 16) & 255
}
于 2012-06-14T10:41:03.263 に答える