簡體   English   中英

如何在 KeyDown 事件 (C#) 中檢測 NumberDecimalSeparator

[英]How do I detect a NumberDecimalSeparator in a KeyDown event (C#)

我試圖查看用戶是否在文本框中按下了小數點分隔符,並根據其他參數允許或禁止它。

NumberdecimalSeparator 返回 46 或 '.' 在我的美國系統上。 許多其他國家/地區使用“,”作為分隔符。 當我按下句點時,KeyDown 事件將 KeyValue 設置為 190。

我是繼續尋找逗號/句點,還是有更好的方法?

電話

CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator

獲取當前用戶界面文化的小數點分隔符。 您可以使用其他文化來獲取其他語言的分隔符。


編輯

從我的系統中報告的 166 種文化( CultureInfo.GetCultures(CultureTypes.SpecificCultures).Count() )來看,似乎只使用了兩個分隔符:句點和逗號。 你可以在你的系統中試試這個:

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

假設這是真的,此方法可能會有所幫助(請注意, keyCodemodifiers標志進行 OR 運算以消除無效組合):

    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 ,您將在KeyPressEventArgs獲得一個字符,您可以將其用於比較。

注意:您應該真正比較NumberDecimalSeparator字符,因為它是一個字符串,而不是單個字符,因此您需要考慮字符串中有多個字符的情況。

如果您需要知道按下的字符是否是十進制分隔符:

private void Control_KeyPress(object sender, KeyPressEventArgs e)
{
    char separator = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator[0];
    if (e.KeyCahr == separador)
    {
        // true
    }
    else
    {
        // false
    }
}

但是,如果您需要接受十進制數字鍵作為任何文化的十進制分隔符:

    private bool decimalSeparator = false;
    private void Control_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Decimal)
            decimalSeparator = true;
    }

    private void Control_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (decimalSeparator)
        {
            e.KeyChar = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator[0];
            decimalSeparator = false;
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM