2011-02-27 5 views
2
내가 이런 일을하고 싶지

에서 Math.Round와 유형하지만 C#을이 동의하지 않습니다Double 사용 방법? 널 (NULL) .NET

public static void setPrice(Double? value) 
    { 

     if (value != null) { 
      this.TextBoxPrice.Text = Math.Round(value, 2).ToString(); 
     } else { 
      this.TextBoxPrice.Text = "No Price"; 
     } 

    } 

은 그래서 두 nullable 형식을 사용하여 의미합니까? 이 유스 케이스에서는 전혀 쓸모가 없다? 그러면 무엇을 사용할 수 있습니까?

업데이트 : 나는

public static void setPrice(Double? value) 

그래서 난 수정 실제로 의미 mystypo했다.

답변

16

현재 nullable 유형을 사용하고 있지 않습니다. Double은 null이 허용되지 않는 값 유형이므로 null이 될 수 없습니다. 이것은 당신이 원하는 것입니다 : 한편

public static void setPrice(Double? value) 
{ 

    if (value != null) { 
     this.TextBoxPrice.Text = Math.Round(value.Value, 2).ToString(); 
    } else { 
     this.TextBoxPrice.Text = "No Price"; 
    } 
} 

, 당신은 금융 값을 표현하기 위해 double를 사용하지한다. 이진 부동 소수점 유형으로는 부적절합니다. 대신 decimal (또는 decimal?)을 사용하십시오.

(. Double?Nullable<Double>에 해당합니다) 당신이 자바 배경에서 왔어요 경우

, 당신은 Double 기대 될 수있다 시작하는 참조 "래퍼"유형이 될 수 있습니다 - 그것은 아니다. C# double은 단순히 System.Double의 별칭입니다. 그들은 같은 유형입니다.

+0

내가 실제로 두 번을 사용하십시오 mystypo을했다? 그래서 내 코드는 당신 것 같고 작동하지 않습니다. – user310291

+1

@user 당신이 놓친 Jon은'double? '을'Math.Round'에 넘길 때'.Value'를 삽입했습니다. 그리고 그것은'double?'을'double'으로 변환하기 때문에 코드를 수정합니다. 그리고'수학. 돈 '은'이중'이 아니라'이중 '을 기대하고있다. – CodesInChaos

+0

@CodeInChaos 아 그래,이 고마워. :) – user310291

1

나는 Jon Skeet의 답변에 동의하며, 명확한 API +를 사용하여 if-else를 피하기 위해 ClearPrice 메소드를 추가하는 것을 고려할 수도 있습니다.

13

Jon의 대답은 괜찮습니다. 10 진수에 대한 약간의주의를 기울였습니다. 그러나 고차원 프로그래밍을 사용하여 nullable로 메서드를 "옮길"수 있다고 덧붙였습니다. 예를 들어 :

public static Func<T?, T?> Lift<T>(Func<T, T> func) where T : struct 
{ 
    return (T? t)=>t.HasValue ? (T?)func(t.Value) : (T?)null; 
} 

public static Func<A?, R> LiftRef<A, R>(Func<A, R> func) where A : struct where R : class 
{ 
    return (A? a)=>a.HasValue ? func(a.Value) : null; 
} 

을 그리고 지금은 말할 수있다 :

Func<decimal, decimal> round2 = x=>Math.Round(x, 2); 
Func<decimal?, decimal?> liftedRound2 = Lift(round2); 
Func<decimal?, string> liftedToString = LiftRef(decimal.ToString); 
... 

public static void SetPrice(decimal? value) 
{ 
    this.TextBoxPrice.Text == liftedToString(liftedRound2(value)) ?? "No Price"; 
} 
+0

대단히 감사합니다. 매우 재미있을 것 같습니다. – user310291

+1

가장 짧은 금액의 코드에서 가장 많이 묻는 질문의 예로 사용할 수 있습니다. –

+0

그냥 내 마음을 날려 버린 거룩한 허튼 소리 ... :-P – Alxandr