Правило валидации wpf: проверять целое число с точкой вместо запятой - PullRequest
0 голосов
/ 30 октября 2010

Я работаю над приложением ac # wpf, в котором я хочу проверить ввод пользователя в текстовом поле.У меня есть такое правило проверки:

public class NumericRule : ValidationRule
{
    /// <summary>
    /// Checks whether a value can be converted to a numeric value.
    /// </summary>
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        string input = value as string;

        //try conversion
        int result;
        var status = int.TryParse(input, NumberStyles.Any,
                                  CultureInfo.InvariantCulture, out result);

        //return valid result if conversion succeeded
        return status ? ValidationResult.ValidResult
                      : new ValidationResult(false, input + " is not a number");
    }
}

Однако при вводе числа с десятичными числами, например 3,5, оно говорит, что число недопустимоПри вводе 3,5 это нормально.Я хотел бы, чтобы оба числа были действительными, и если введено значение с запятой, оно преобразуется в точку.Кроме того, я хотел бы иметь максимум 3 знака после запятой.

Любая помощь?

Спасибо

1 Ответ

1 голос
/ 30 октября 2010

Полагаю, вы хотите разобрать как double.Если вы хотите оба "," и "."как разделители принимаются, вы можете проверить с несколькими культурами.Добавьте культуры, которые вам необходимо поддержать, в список.

public class NumericRule : ValidationRule
{
    private readonly List<CultureInfo> cultures = new List<CultureInfo> {
        CultureInfo.CurrentCulture,
        CultureInfo.CurrentUICulture,
        CultureInfo.InvariantCulture
    };

    public override ValidationResult Validate (object value, CultureInfo cultureInfo)
    {
        string input = (string)value;

        bool success = false;
        foreach (CultureInfo culture in cultures) {
            double result;
            if (double.TryParse(input, NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint, culture, out result)) {
                int decimalPos = input.IndexOf(culture.NumberFormat.NumberDecimalSeparator);
                if (decimalPos == -1) {
                    success = true;
                    break;
                }
                if (input.Substring(decimalPos + 1).Length > 3)
                    return new ValidationResult(false, "Too many digits in " + input);
                success = true;
                break;
            }
        }
        return success ? ValidationResult.ValidResult : new ValidationResult(false, input + " is not a number");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...