2011-07-03 5 views
4

.Net Compact Framework 2.0을 사용하면 정수 (Int32.TryParse은 Compact Framework에서 지원되지 않습니다)의 유효성을 검사하는 방법은 무엇입니까?정수 유효성 검사 압축 프레임

+0

http://stackoverflow.com/questions/363158/net-compact-framework-tips-tricks-and-gotchas – bevacqua

답변

0

숫자가 문자열 인 경우 문자열 char 배열을 가져올 수 있으며 모든 문자에 대해 Char.IsNumber이 true인지 확인하십시오.

음수가 필요할 경우 첫 번째 문자가 '-'인지 확인하고 범위를 초과하는 숫자 (int/max/최대 값)를 보호하기 위해 try/catch 블록을 추가하십시오. 최소/최대에 근접한 숫자를 다룰 필요가없는 경우 최대 길이 (아마 6-7 자리)를 설정하고 간단히 string.Length을 확인하십시오.

유효한 경우에만 int이 발생하고 잘못된 동작이 드문 경우는 드물지만 잘못된 시도 일 수 있습니다 (내 의견은 ctackes 답변 참조).

+0

무엇 '에 대해 "-1"'? – user7116

+0

'' "4697357344197412413772951060481818689355170685471900754944636793"'? – jason

+0

그가 기대하는 숫자에 따라 다릅니다. 서명을 확인하는 것은 간단합니다. 정말 큰 숫자를 보호하기 위해 try/catch 블록을 사용할 수 있습니다. 이것은 유스 케이스에 따라 전혀 발생하지 않아야한다. – Zebi

3

"유효성 검사"란 무엇을 의미합니까? 던지지 않고 구문 분석한다는 의미입니까?

static bool TryParse(string s, out int value)   
{ 
    try 
    { 
     value = int.Parse(s); 
     return true; 
    } 
    catch 
    { 
     value = 0; 
     return false; 
    } 
} 
+0

이것 역시주의해야합니다. 비 int 문자열이 충분하다면 예외 발생이 상당히 비싸기 때문에 성능 문제가 발생할 수 있습니다. 한때 유사한 패턴을 사용하여 특정 상황에서 UI 전체를 느리게 만들었습니다. – Zebi

1
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 
3
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

2

가 동일했다 문제. 이 시도 :

static bool numParser(string s) 
{ 
    foreach (char c in s) 
    if (!char.IsNumber(c)) 
     return false; 
    return true; 
} 
+0

표지판을 고려하지 않았습니다. 또한 IsDigit을 사용하십시오. MSDN에 따르면 : 숫자에는 숫자 이외에 문자, 분수, 첨자, 위 첨자, 로마 숫자, 통화 분자 및 원으로 둘러싸인 숫자가 포함됩니다. –

관련 문제