2014-02-05 7 views
-1

일반 번호 :나는이 같은 방법을 가지고 검증

public static bool IsPercentage<T>(T value) where T : IComparable 
{ 
    return value.CompareTo(0) >= 0 && value.CompareTo(1) <= 0; 
} 

내가 어떤 번호가 범위와 0 < = N < = 1. 그러나이 단지 작품을 떨어질 경우 확인이를 사용하고 싶습니다 CompareTo는 동등한 유형에서만 작동하기 때문에 정수입니다. 이 작업을 수행하는 다른 방법이 있습니까?

+0

어떤 종류의이 작업을 예상 하는가? 플로트, 더블, 10 진수 및 ...? –

+0

@ThomasW. 가급적 모든 숫자 유형 – ConditionRacer

+0

@Servy 나는 당신이 * duplicate *로 설정 한 질문과 아무런 관련이 없다고 생각합니다. OP는'T'를'int' 만 받아들이는 메소드를 필요로하지 않습니다 (하나의 타입을위한 일반적인 메소드를 가지고있는 점은 무엇입니까?). 'T == int'에는'0' /'1','T == double'에는'0d' /'1d' 등 적절하게 타입 된'0'과'1' 값을 얻기 위해서는'CompareTo'가 필요합니다. – MarcinJuraszek

답변

1

아니라 당신이 Convert.ToDecimal을 사용할 수 있습니다, 당신은 일반적인 될 필요가 없습니다 : 개체의

public static bool IsPercentage(Object value) 
{ 
    decimal val = 0; 
    try 
    { 
     val = Convert.ToDecimal(value); 
    } 
    catch 
    { 
     return false; 
    } 
    return val >= 0m && val <= 1m; 
} 
+0

이것은 1.1m에 대해'true'를 반환합니다. – Servy

+0

@Servy {facepalm} 감사합니다 - 십진수로 변경되었습니다. –

+1

이 코드에서는 십진수로 변환 할 때 약간 큰 float/double 값이 있습니다. 1과 같은 것으로 간주됩니다. 예를 들어,이 메소드를 호출하려면'1f + float.Epsilon'을 사용하십시오. 그것은 하나보다 컸음에도 불구하고 사실로 돌아올 것입니다. '1d + double.Epsilon'도 마찬가지입니다. – Servy

1

이렇게하려면 Expression Tree를 사용할 수 있습니다. 도우미, 정적 클래스

static class NumericHelper<T> 
{ 
    public static T Zero { get; private set; } 
    public static T One { get; private set; } 

    static NumericHelper() 
    { 
     Zero = default(T); 
     One = Expression.Lambda<Func<T>>(
       Expression.Convert(
        Expression.Constant(1), 
        typeof(T) 
       ) 
      ).Compile()(); 
    } 
} 

그것은 런타임에 (T)1 캐스트를 생성을 고려하고 One 속성에 결과를 할당합니다. 정적 생성자는 올바르게 입력 된 1 값을 생성하는 데 필요한 코드가 한번만 실행되므로 T마다 한 번만 실행됩니다. 당신이 (T)1 변환을 지원하지 않는 유형 T로 전화를하려고하면

public static bool IsPercentage<T>(T value) where T : IComparable 
{ 
    return value.CompareTo(NumericHelper<T>.Zero) >= 0 && value.CompareTo(NumericHelper<T>.One) <= 0; 
} 

년 OFC는 실패합니다.

관련 문제