2014-01-24 4 views
6

내 응용 프로그램에는 관리자가 특정 사용자에 대한 할인율을 설정할 수있는 텍스트 상자 (txtDiscount)가 있거나 그렇지 않을 수도 있습니다. 그래서 invalid argument에 대한 오류와 분명히 내가 거 TryParse에서 사용 해요 경우 널 (NULL)이 될 수없는 discountdouble.TryParse를 사용하는 방법 출력이 null 일 때 허용됩니까?

double? discount = null; 
if (!string.IsNullOrEmpty(txtDiscount.Text)) 
{ 
    if (!double.TryParse(txtDiscount.Text, out discount)) errors.Add("Discount must be a double."); 
} 

: 백 엔드에 나는 지금 내가이 그래서 데이터를 저장할 . 나는 많은 사람들이 이러한 유형의 상황에 대한 확장을하고있는 것을 보았으나 지금은 필요하다고 생각하지 않습니다. 내가 생각할 수있는 것은과 같이 다른 변수를 사용하는 것입니다 :

double? discount = null; 
private double _discount; 
if (!string.IsNullOrEmpty(txtDiscount.Text)) 
{ 
    if (!double.TryParse(txtDiscount.Text, out _discount)) 
    { 
    errors.Add("Discount must be adouble."); 
    } 
    else 
    { 
    discount = _discount; 
    } 
} 

한 다음 데이터베이스에 값을 전달 내 널 (NULL) discount를 사용합니다. 하지만 실제로는 위의 코드가 마음에 들지 않습니다. 그런 일은 꽤 복잡해 보이지만 더 나은 것을 생각할 수는 없습니다. 그렇다면 확장 방법을 사용하지 않고이 상황을 어떻게 처리 할 수 ​​있습니까?

double? discount = null; 

if (!String.IsNullOrEmpty(txtDiscount.Text)) 
{ 
    double value; 
    if (Double.TryParse(txtDiscount.Text, out value))  
     discount = value; 
    else  
     errors.Add("Discount must be a double."); // discount will have null value 
} 

을하지만 확장에 모든 논리를 이동했던 : 단지 TryParse 메소드에 건네 지역이 아닌 널 (NULL) 값을 사용 -

+3

가 왜 특별한 경우를 처리하여 응용 프로그램의 설계를 복잡하게 않습니다

개인적으로, 난 그냥 더블 Null 허용하는 구문 분석 확장자 가고 싶어? 왜 시스템은 항상 할인 가치 (0.0)를 가정하고 누군가가 이것을 바꿀 때만 새로운 숫자를 얻습니다. 모든 계산에 항상 할인이 포함될 때 (0.0 인 경우에도) 특수 사례 처리가 필요하지 않습니다. GUI의 경우 빈 문자열 검사가 필요하지만 실수를하지 않고 프론트 엔드에서 데이터베이스 디자인을 반영하지 마십시오. – Samuel

+0

글쎄,이 경우에는'0.0'은 여전히 ​​값이기 때문에 nullable이 괜찮다고 생각합니다. 사용자가 0.0 %의 할인을 받았다고 말할 수 있습니다. null 허용은이 사용자가 실제로 나를 위해 할인을하지 않는다고 말합니다 더 의미. 그러나 제 질문이 좀 더 일반적 일지라도, 형식을 'dobule'로 변경하더라도이 경우를 다루는 방법을 여전히보고 싶습니다. 꽤 표준적인 것으로 보입니다. – Leron

+0

@ Leron 할인이 마이너스 일 경우 어떻게해야합니까? –

답변

4

당신은 확장 메서드없이 분석 할 수 있습니다.

+1

상태와 몸이 완전히 중복되면 생각하지 않습니까? 이것은 OP 코드에서 아무 것도 개선하지 않습니다 –

+0

@SriramSakthivel 감사합니다! 그 일을 놓쳤습니다 (왜냐하면 처음부터 삼항 연산자를 사용하려고 시도했기 때문입니다) –

-1
Nullable<double> discount = new Nullable<double>(); 

기본값은 당신이 당신은 단지 로컬이 아닌 nullable 형식으로 추한 코드를 작성해야 할거야 다시

1
static void Main() 
{ 
    var testStrings = new[] { "", "1.234" }; 

    foreach(var testString in testStrings) 
    { 
     double output; 
     double? value = null; 

     if(double.TryParse(testString, out output)) 
     { 
      value = output; 
     } 

     Console.WriteLine("{0}", value.HasValue ? value.Value.ToString() : "<null>"); 
    } 
} 
-1
if(double.TryParse(txtDiscount.Text?? "", out _discount)) 
    discount=_discount; 
else Console.WriteLine("Discount must be adouble."); 
3

null로 설정할 필요가없는 널 (null) allready입니다 다른 방법으로을 사용하면 할인이 없다는 것을 정의 할 수 있습니다. 나는 nullable double이 그것을 나타내는 깔끔한 방법이라고 동의하지만 코드가 당신을 괴롭히는 경우 다른 것을 시도해보십시오 (예 : bool, 예 : discount_given = true).

public static bool ParseDouble(string s, out double? dd) 
    { 
     double d; 
     bool ret = double.TryParse(s, out d); 

     if (ret) 
      dd = d; 
     else 
      dd = null; 

     return ret; 
    } 
0
public static double ToDouble(this string value, double fallbackValue = 0) 
    { 
     double result; 

     return double.TryParse(value, out result) ? result : fallbackValue; 
    }