[C#] 문자열을 nullable int로 구문 분석하는 방법

C #에서 문자열을 nullable int로 구문 분석하고 싶습니다. 즉. 문자열의 int 값을 반환하거나 구문 분석 할 수없는 경우 null을 반환하고 싶습니다.

나는 이것이 효과가 있기를 바랐다.

int? val = stringVal as int?;

그러나 그것은 작동하지 않으므로 지금하는 방법은이 확장 방법을 작성하는 것입니다

public static int? ParseNullableInt(this string value)
{
    if (value == null || value.Trim() == string.Empty)
    {
        return null;
    }
    else
    {
        try
        {
            return int.Parse(value);
        }
        catch
        {
            return null;
        }
    }
}   

더 좋은 방법이 있습니까?

편집 : TryParse 제안에 감사드립니다. 나는 그것에 대해 알고 있었지만 거의 동일하게 작동했습니다. nullable int로 직접 구문 분석 할 기본 제공 프레임 워크 방법이 있는지 알고 싶습니다.



답변

int.TryParse 아마 좀 더 쉬울 것입니다 :

public static int? ToNullableInt(this string s)
{
    int i;
    if (int.TryParse(s, out i)) return i;
    return null;
}

편집 @Glenn int.TryParse은 “프레임 워크에 내장되어 있습니다”. 그것은하고 int.Parse있습니다 의 int로 문자열을 구문 분석하는 방법.


답변

조건부 연산자와 null널 입력 가능 유형으로 캐스트 할 수 있다는 사실을 사용하여 한 행으로이를 수행 할 수 있습니다 (기존 int가없는 경우 두 행 TryParse) 의 출력에 재사용 할 수 있습니다 .

사전 C # 7 :

int tempVal;
int? val = Int32.TryParse(stringVal, out tempVal) ? Int32.Parse(stringVal) : (int?)null;

메소드 호출에서 출력 변수를 선언 할 수있는 C # 7의 업데이트 된 구문을 사용하면 훨씬 간단 해집니다.

int? val = Int32.TryParse(stringVal, out var tempVal) ? tempVal : (int?)null;


답변

[ @sblom의 제안에 따라 최신 C #을 사용하도록 업데이트 됨 ]

나는이 문제가 있었고 결국 이것으로 끝났다 (결국 a if와 2 return는 너무 오래 감았 다!).

int? ToNullableInt (string val)
    => int.TryParse (val, out var i) ? (int?) i : null;

더 심각한 int것은 C # 키워드 인 Int32. .NET Framework BCL 유형 인 을 혼합하지 마십시오. 작동하지만 코드가 지저분 해 보입니다.


답변

Glenn Slaven : nullable int로 직접 구문 분석하는 내장 프레임 워크 방법이 있는지 알고 싶습니다.

값이 null 또는 빈 문자열처럼 유효하지만 유효하지 않은 값에 대한 예외를 throw하므로 예외를 잡아서 기본값을 반환 해야하는 경우이 방법은 null이 가능한 int (및 int가 아닌)로 직접 구문 분석됩니다 그러한 상황에서 :

public static T Parse<T>(object value)
{
    try { return (T)System.ComponentModel.TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(value.ToString()); }
    catch { return default(T); }
}

이 접근 방식은 널 입력 가능 구문 분석 및 널 입력 가능에 여전히 사용할 수 있습니다.

enum Fruit { Orange, Apple }
var res1 = Parse<Fruit>("Apple");
var res2 = Parse<Fruit?>("Banana");
var res3 = Parse<int?>("100") ?? 5; //use this for non-zero default
var res4 = Parse<Unit>("45%");

주의 : 변환기에는 예외를 캡처하는 대신 사용할 수있는 IsValid 메서드가 있습니다 (예외가 발생 하면 예상 한 경우 불필요한 오버 헤드 가 발생 함 ). 불행히도 .NET 4 이후에만 작동하지만 올바른 DateTime 형식의 유효성을 검사 할 때 로케일을 확인하지 못하는 문제가 여전히 있습니다 ( 버그 93559 참조) .


답변

var result = int.TryParse(foo, out var f) ? f : default(int?);

출처 :


답변

오래된 주제이지만 어떻습니까?

public static int? ParseToNullableInt(this string value)
{
     return String.IsNullOrEmpty(value) ? null : (int.Parse(value) as int?);
}

나는 null을 구문 분석 할 requriement, TryParse 버전이 ToNullableInt32 (XXX)에서 오류를 발생시키지 않는 것이 좋습니다. 원치 않는 자동 오류가 발생할 수 있습니다.


답변

이 시도:

public static int? ParseNullableInt(this string value)
{
    int intValue;
    if (int.TryParse(value, out intValue))
        return intValue;
    return null;
}