5

ユーザーがテキストボックスで小数点記号を押したかどうかを確認し、他のパラメーターに応じてそれを許可または抑制しようとしています。

NumberdecimalSeparator は 46 または '.' として返されます。私の米国のシステムで。他の多くの国では、セパレータとして「,」が使用されています。ピリオドを押すと、KeyDown イベントによって KeyValue が 190 に設定されます。

コンマ/ピリオドを探し続けるだけですか、それとももっと良い方法がありますか?

4

3 に答える 3

9

呼び出し

CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator

現在のユーザー インターフェイス カルチャの小数点記号を取得します。他の文化を使用して、他の言語の区切り記号を取得できます。


編集

私のシステム ( ) で報告されている 166 のカルチャから、CultureInfo.GetCultures(CultureTypes.SpecificCultures).Count()ピリオドとコンマの 2 つの区切り文字のみが使用されているようです。システムでこれを試すことができます:

var seps = CultureInfo.GetCultures(CultureTypes.SpecificCultures)
            .Select(ci => ci.NumberFormat.NumberDecimalSeparator)
            .Distinct()
            .ToList();

これが真であると仮定すると、この方法が役立つ可能性があります (無効な組み合わせを排除するために、フラグkeyCodeと OR されることに注意してください)。modifiers

    private bool IsDecimalSeparator(Keys keyCode, Keys modifiers)
    {
        Keys fullKeyCode = keyCode | modifiers;
        if (fullKeyCode.Equals(Keys.Decimal))          // value=110
            return true;

        string uiSep = CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator;
        if (uiSep.Equals("."))
            return fullKeyCode.Equals(Keys.OemPeriod); // value=190
        else if (uiSep.Equals(","))
            return fullKeyCode.Equals(Keys.Oemcomma);  // value=188
        throw new ApplicationException(string.Format("Unknown separator found {0}", uiSep));
    }

最後の注意: Keys enumerationによると、言及した値 46 は DEL (削除) キー (つまり、Num Lock がオフのときのポイント) に対応します。

于 2008-10-15T21:49:41.550 に答える
0

ここでの問題は、 の値がKeyEventArgs文字ではなくキー コードであることです。代わりに処理すると、比較に使用できるKeyPresschar が得られます。KeyPressEventArgs

注:NumberDecimalSeparator単一の文字ではなく文字列であるため、実際に文字を比較する必要があるため、文字列に複数の文字が含まれるシナリオを考慮する必要があります。

于 2008-10-16T04:02:11.707 に答える