NaN 또는 IsNumeric에 해당하는 C #은 무엇입니까?


103

입력 문자열에 숫자 값이 포함되어 있는지 (또는 반대로 숫자가 아님)를 테스트하는 가장 효율적인 방법은 무엇입니까? 나는 Double.Parse또는 정규식을 사용할 수 있다고 생각 하지만 (아래 참조) 자바 스크립트 NaN()또는 IsNumeric()(그 VB 였는지 기억할 수 없습니까?) 와 같이 이것을 수행하는 방법이 있는지 궁금합니다 .

public static bool IsNumeric(this string value)
{
    return Regex.IsMatch(value, "^\\d+$");
}

답변:


176

정규식 오버 헤드가 없습니다.

double myNum = 0;
String testVar = "Not A Number";

if (Double.TryParse(testVar, out myNum)) {
  // it is a number
} else {
  // it is not a number
}

덧붙여서 GUID를 제외한 모든 표준 데이터 유형은 TryParse를 지원합니다.

업데이트
secretwep는 "2345"값이 위의 테스트를 숫자로 통과 할 것임을 나타냅니다. 그러나 문자열 내의 모든 문자가 숫자인지 확인해야하는 경우 다른 접근 방식을 취해야합니다.

예 1 :

public Boolean IsNumber(String s) {
  Boolean value = true;
  foreach(Char c in s.ToCharArray()) {
    value = value && Char.IsDigit(c);
  }

  return value;
}

또는 조금 더 멋지고 싶다면

public Boolean IsNumber(String value) {
  return value.All(Char.IsDigit);
}

업데이트 2 (@stackonfire에서 null 또는 빈 문자열 처리)

public Boolean IsNumber(String s) { 
    Boolean value = true; 
    if (s == String.Empty || s == null) { 
        value=false; 
    } else { 
        foreach(Char c in s.ToCharArray()) { 
            value = value && Char.IsDigit(c); 
        } 
    } return value; 
}

필요한 경우, 당신은 공공 정적 부울 IsInteger (문자열 sMaybeANumber)와 같은보다 유용한 유틸리티 방법으로 위의 코드를 래핑 할 수
Gishu

@Gishu : 당신이 걱정하는 것은 숫자가 변환 될 수 있는지 여부뿐이라면 당신 말이 맞습니다.
NotMe

2
이것에 대한 유일한 문제 Number는 Javascript 의 객체가 float 또는 정수이므로 double.TryParse로 변경하는 것이 더 정확할 것입니다
Chris S

7
문자열 "NaN"및 "Infinity"가으로 구문 분석 double되므로주의해야 할 수도 있지만 많은 사람들이 숫자가 아닌 것으로 간주합니다.
Mike Zboray

1
null 또는 빈 문자열을 처리하도록 수정 된 예제 1, 그렇지 않으면 IsNumber가 잘못 true를 반환하도록했습니다. public Boolean IsNumber(String s) { Boolean value = true; if (s == String.Empty || s == null) { value=false; } else { foreach(Char c in s.ToCharArray()) { value = value && Char.IsDigit(c); } } return value; }
stackonfire

41

나는 이것과 같은 것을 선호한다. 그것은 당신이 무엇 NumberStyle을 테스트 할지 결정할 수있게 해준다 .

public static Boolean IsNumeric(String input, NumberStyles numberStyle) {
    Double temp;
    Boolean result = Double.TryParse(input, numberStyle, CultureInfo.CurrentCulture, out temp);
    return result;
}

7
지금까지 :) 대신 Int.TryParse의 Double.TryParse에있는 유일한 사람 인을위한 한
johnc

이것은 또한 분명히 거의 확장 방법입니다.
Anthony Mastrean

19

이전 정답뿐만 아니라 아마 "숫자가 아님"의 일반적인 사용에 비수 (NaN) 인 것을 지적 가치가 없는 숫자 값으로 평가 될 수없는 문자열에 해당. NaN은 일반적으로 결과가 정의되지 않은 "불가능"계산의 결과를 나타내는 데 사용되는 숫자 값으로 이해됩니다. 이 점에서 Javascript 사용이 약간 오해의 소지가 있다고 말하고 싶습니다. C #에서 NaN은 단일 및 이중 숫자 형식의 속성으로 정의되며 0으로 0으로 다이빙 한 결과를 명시 적으로 참조하는 데 사용됩니다. 다른 언어에서는이를 사용하여 다른 "불가능"값을 나타냅니다.


11

나는 이것이 확장과 람다 예제를 통해 여러 가지 방법으로 대답되었지만 가장 간단한 솔루션을 위해 두 가지를 조합 한 것으로 알고 있습니다.

public static bool IsNumeric(this String s)
{
    return s.All(Char.IsDigit);
}

또는 Visual Studio 2015 (C # 6.0 이상)를 사용하는 경우

public static bool IsNumeric(this String s) => s.All(Char.IsDigit);

한 줄에 멋진 C # 6. 물론 이것은 숫자 만 테스트하기 때문에 제한적입니다.

사용하려면 문자열을 가지고 다음과 같이 메소드를 호출하십시오.

bool IsaNumber = "123456".IsNumeric();

1
확장 메서드에 익숙하지 않은 사용자의 경우 더 많은 정보를 포함하는 것이 유용 할 수 있습니다 (또는 더 완전한 예제를 제공하기 위해 적어도 주변 정적 클래스).
johnnyRose

소수가있는 숫자에 대해 false를 반환하기 때문에이 솔루션이 마음에 들지 않습니다. 정수에 유용 할 수 있지만 이것이 메서드에 사용하려는 경우 IsInteger로 이름을 바꿔야합니다.
technoman23

5

예, IsNumeric은 VB입니다. 일반적으로 사람들은 약간 어색하지만 TryParse () 메서드를 사용합니다. 제안했듯이 언제든지 직접 작성할 수 있습니다.

int i;
if (int.TryParse(string, out i))
{

}

5

나는 확장 방법을 좋아하지만 가능하면 예외를 던지는 것을 좋아하지 않습니다. 여기에서 2 개의 답변 중 가장 좋은 확장 방법을 선택했습니다.

    /// <summary>
    /// Extension method that works out if a string is numeric or not
    /// </summary>
    /// <param name="str">string that may be a number</param>
    /// <returns>true if numeric, false if not</returns>
    public static bool IsNumeric(this String str)
    {
        double myNum = 0;
        if (Double.TryParse(str, out myNum))
        {
            return true;
        }
        return false;
    }

4

C #에서 Visual Basic 함수를 계속 사용할 수 있습니다. 당신이해야 할 유일한 일은 아래 표시된 내 지침을 따르는 것입니다.

  1. 프로젝트를 마우스 오른쪽 단추로 클릭하고 "참조 추가"를 선택하여 Visual Basic 라이브러리대한 참조를 추가하십시오.

여기에 이미지 설명 입력

  1. 그런 다음 아래와 같이 클래스로 가져옵니다 .

    Microsoft.VisualBasic 사용;

  2. 다음 으로 아래와 같이 원하는 곳에서 사용하십시오 .

                if (!Information.IsNumeric(softwareVersion))
            {
                throw new DataException(string.Format("[{0}] is an invalid App Version!  Only numeric values are supported at this time.", softwareVersion));
            }

희망, 이것은 도움과 행운을 빕니다!


2
나는이 방법을 권하고 싶지 않다 있지만, 그것은 이다 정답. 왜 반대표를 받았는지 확실하지 않고, 이유도 설명되지 않았기 때문에 반대표를 던졌습니다. :-)
Abacus

4

VB에는 IsNumeric기능이 있습니다. 당신은 Microsoft.VisualBasic.dll그것을 참조 하고 사용할 수 있습니다.


2.0 버전 이상의 .net에서만 VB 방법을 얻을 수 있습니까?
Ed S.

@ChuckD : 그것은 주관적입니다. json을 다루는 외부 라이브러리를 참조하거나 json을 직접 구문 분석하기 위해 작성합니까?
shahkalpesh

@ChuckD : 나에게 드라이브를 남겨두고 왜 그것이 쓰레기인지 설명하십시오. 나에게는 유용한 클래스 / 함수를 포함하는 또 다른 dll 일뿐입니다.
shahkalpesh

@ChuckD 나는 당신이 여기에서 불합리하다고 생각합니다. 이 함수는 작업을 수행하고 가져 오기가 쉽고 그다지 큰 문제가 아닙니다.
Bugs

1
@ChuckD IsNumeric에 대한 VisualBasic.dll 가져 오기 로 시작하는 대신 건설적인 비판으로 시작하고 싶을 수 있습니다. 누군가를 되 찾을 것입니다. 그 대답은 '09 년에 돌아 왔고 지금도 일부 사람들에게 유용 할 것입니다.
Bugs

4

간단한 확장 :

public static bool IsNumeric(this String str)
{
    try
    {
        Double.Parse(str.ToString());
        return true;
    }
    catch {
    }
    return false;
}

입력 매개 변수가 문자열이면 왜 .ToString ()을 사용합니까?
technoman23

이 답변은 NER1808의 솔루션과 같은 답변에 사용되는 TryParse 메서드에 필요한 정크 변수를 제거하기 때문에 좋습니다.
technoman23

3
public static bool IsNumeric(string anyString)
{
    if (anyString == null)
    {
        anyString = "";
    }

    if (anyString.Length > 0)
    {
        double dummyOut = new double();
        System.Globalization.CultureInfo cultureInfo = new System.Globalization.CultureInfo("en-US", true);
        return Double.TryParse(anyString, System.Globalization.NumberStyles.Any, cultureInfo.NumberFormat, out dummyOut);
    }
    else
    {
        return false;
    }
}

3

아마도 이것은 C # 3 기능이지만 double.NaN.


2

실제로 Double.NaN는 모든 .NET 버전 2.0 이상에서 지원됩니다.


2

나는 1 ~ 2 년 동안 Gishu의 제안과 같은 bool 함수로 캡슐화 된 Chris Lively의 스 니펫 (선택된 답변)을 사용하고있었습니다. 추가 처리를 진행하기 전에 특정 쿼리 문자열이 숫자로만되어 있는지 확인하는 데 사용했습니다. 특히 "3645"와 같은 숫자 뒤에 쉼표가 전달 될 때마다 표시된 답변이 처리하지 않는 잘못된 쿼리 문자열을 받기 시작했습니다 (참으로 반환 됨). 이것은 결과 모드입니다.

   static public bool IsNumeric(string s)
   {
      double myNum = 0;
      if (Double.TryParse(s, out myNum))
      {
         if (s.Contains(",")) return false;
         return true;
      }
      else
      {
         return false;
      }
   }

흥미로워 서 +1. 사용법 질문에 가깝다고 생각합니다. 즉, 오류를 발생시키지 않고 값을 숫자로 변환 할 수 있는지 확인하려면 원래 대답이 좋습니다. 그러나 문자열 내의 모든 문자가 실제로 숫자라는 것이 더 염려된다면 완전히 다른 접근 방식이 필요합니다
NotMe

Double.TryParse(s, NumberStyles.Float, CultureInfo.InvariantCulture, out myNum)
Sam Harwell 2013-06-07

0

번호를 반환하는 약간 다른 버전이 있습니다. 대부분의 경우 문자열을 테스트 한 후 숫자를 사용하고 싶을 것입니다.

public bool IsNumeric(string numericString, out Double numericValue)
{
    if (Double.TryParse(numericString, out numericValue))
        return true;
    else
        return false;
}

0

이것은 Siir가 제안한 솔루션의 수정 된 버전입니다. 확장 메서드를 추가하는 것이 호출 메서드의 재사용과 단순성을위한 최상의 솔루션이라는 것을 알았습니다.

public static bool IsNumeric(this String s)
{
    try { double.Parse(s); return true; }
    catch (Exception) { return false; }
}

두 줄에 맞도록 메서드 본문을 수정하고 불필요한 .ToString () 구현을 제거했습니다. 확장 메서드에 익숙하지 않은 사람들을 위해 다음을 구현하는 방법이 있습니다.

ExtensionMethods 라는 클래스 파일을 만듭니다 . 이 코드를 붙여 넣으십시오.

using System;
using System.Collections.Generic;
using System.Text;

namespace YourNameSpaceHere
{
    public static class ExtensionMethods
    {
        public static bool IsNumeric(this String s)
        {
            try { double.Parse(s); return true; }
            catch (Exception) { return false; }
        }
    }
}

YourNameSpaceHere 를 실제 네임 스페이스 로 바꿉니다 . 변경 사항을 저장하다. 이제 앱의 어디에서나 확장 방법을 사용할 수 있습니다.

bool validInput = stringVariable.IsNumeric();

참고 :이 메서드는 정수와 소수에 대해 true를 반환하지만 문자열에 쉼표가 포함되어 있으면 false를 반환합니다. 쉼표 나 "$"와 같은 기호로 입력을 받아들이려면 먼저 해당 문자를 제거한 다음 IsNumeric인지 테스트하는 방법을 구현하는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.