c # целочисленная валидация - PullRequest
4 голосов
/ 03 июля 2011

Как использовать .Net Compact Framework 2.0, как проверить целое число (Int32.TryParse не поддерживается в Compact Framework)?

Ответы [ 5 ]

3 голосов
/ 03 июля 2011
  static bool TryParseImpl(string s, int start, ref int value)
  {
    if (start == s.Length) return false;
    unchecked {
      int i = start;
      do {
        int newvalue = value * 10 + '0' - s[i++];
        if (value != newvalue / 10) { value = 0; return false; } // detect non-digits and overflow all at once
        value = newvalue;
      } while (i < s.Length);
      if (start == 0) {
        if (value == int.MinValue) { value = 0; return false; }
        value = -value;
      }
    }
    return true;
  }

  static bool TryParse(string s, out int value)        
  {
    value = 0;
    if (s == null) return false;
    s = s.Trim();
    if (s.Length == 0) return false;
    return TryParseImpl(s, (s[0] == '-')? 1: 0, ref value);
  }

Демо: http://ideone.com/PravA

3 голосов
/ 03 июля 2011

Что вы подразумеваете под «подтвердить»?Вы имеете в виду разбор без броска?

static bool TryParse(string s, out int value)        
{
    try
    {
        value = int.Parse(s);
        return true;
    }
    catch
    {
        value = 0;
        return false;
    }
}
2 голосов
/ 11 октября 2012

Была такая же проблема.Попробуйте это:

static bool numParser(string s)
{
  foreach (char c in s)
    if (!char.IsNumber(c))
      return false;
  return true;
}
1 голос
/ 03 июля 2011
public static bool IsInt(string s) {
    bool isInt = true;
    for (int i = 0; i < s.Length; i++) {
        if (!char.IsDigit(s[i])) {
            isInt = false;
            break;
        }
    }
    return isInt;
}

Пример:

string int32s = "10240";
bool isInt = IsInt(int32s); // resolves true

Или:

string int32s = "1024a";
bool isInt = IsInt(int32s); // resolves false
0 голосов
/ 03 июля 2011

Если ваш номер является строкой, вы можете получить массив строк и проверить, истинно ли Char.IsNumber для каждого символа.

Проверьте, является ли первый символ '-' для учета отрицательных чисел, если они вам нужны, и добавьте блок try / catch для защиты от чисел, выходящих за пределы диапазона (значение int min / max). Если вам не нужно иметь дело с числами, приближающимися к минимальному / максимальному, рассмотрите возможность установки максимальной длины (возможно, 6-7 цифр) и просто отметьте string.Length вместо этого.

Если вероятность того, что вы встретите только действительные int с и недопустимые, являются редкими недопустимыми операциями, вы можете придерживаться простого блока try / catch (см. Мой комментарий к ответу ctackes).

...