ユーザーがテキストボックスで小数点記号を押したかどうかを確認し、他のパラメーターに応じてそれを許可または抑制しようとしています。
NumberdecimalSeparator は 46 または '.' として返されます。私の米国のシステムで。他の多くの国では、セパレータとして「,」が使用されています。ピリオドを押すと、KeyDown イベントによって KeyValue が 190 に設定されます。
コンマ/ピリオドを探し続けるだけですか、それとももっと良い方法がありますか?
ユーザーがテキストボックスで小数点記号を押したかどうかを確認し、他のパラメーターに応じてそれを許可または抑制しようとしています。
NumberdecimalSeparator は 46 または '.' として返されます。私の米国のシステムで。他の多くの国では、セパレータとして「,」が使用されています。ピリオドを押すと、KeyDown イベントによって KeyValue が 190 に設定されます。
コンマ/ピリオドを探し続けるだけですか、それとももっと良い方法がありますか?
呼び出し
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 がオフのときのポイント) に対応します。
ここでの問題は、 の値がKeyEventArgs
文字ではなくキー コードであることです。代わりに処理すると、比較に使用できるKeyPress
char が得られます。KeyPressEventArgs
注:NumberDecimalSeparator
単一の文字ではなく文字列であるため、実際に文字を比較する必要があるため、文字列に複数の文字が含まれるシナリオを考慮する必要があります。