문자열이 숫자인지 식별


731

이 문자열이 있으면 :

  1. "abc" = false

  2. "123" = true

  3. "ab2" = false

IsNumeric()문자열이 유효한 숫자인지 식별 ​​할 수 있는 명령 이 있습니까?


79
그들의 예에서 전체 문자열 이 숫자를 나타내는 지 알 수 있습니다.
— Lucas

47
반환 str.All (Char.IsDigit);
— Mohsen

13
str.All (Char.IsDigit)은 "-2"및 "3E14"뿐만 아니라 "3.14"를 false로 선언합니다. 아니 말할 것도 "을 0x10"
— 헤럴드 Coppoolse

4
확인하려는 숫자 유형에 따라 다릅니다. 구분 기호가없는 정수 (예 : 10 진수 문자열)의 경우이 검사가 작동하며 허용되는 대답과 OP에 포함 된 것과 동일합니다.
— Alex Mazzariol

1
@Lucas는 귀하의 의견에 감사드립니다, 당신은 내가 얼마나 문자열을 int로 구문 분석하고 그것이 왜 실패했는지 궁금해했는지
— 전혀 모른다

답변:


1160
int n;
bool isNumeric = int.TryParse("123", out n);

C # 7부터 업데이트 :

var isNumeric = int.TryParse("123", out int n);

또는 숫자가 필요하지 않으면 out 매개 변수를 버릴 수 있습니다

var isNumeric = int.TryParse("123", out _);

var에 들 각각의 유형에 의해 대체 될 수 있습니다!


126
비록 double.TryParse를 사용하지만 숫자를 나타내는 지 알고 싶기 때문입니다.
— 존 Gietzen

5
문자열을 "-123"또는 "+123"으로 전달하면 함수가 true를 반환합니다. 정수에 양수 값과 음수 값이 있음을 이해합니다. 그러나이 문자열이 사용자가 입력 한 텍스트 상자에서 오는 경우 false를 반환해야합니다.
— user2323308

9
이것은 사용자가 -2,147,483,648에서 2,147,483,647 이상의 값을 입력 할 때까지 좋은 해결책입니다. 그러면 자동으로 실패합니다
— BlackTigerX

0,60 (쉼표입니다!)을 구문 분석해보십시오. 잘못된 숫자이지만 60으로 구문 분석됩니다!
— Paul Zahra

2
이 확인을 위해 확장 방법을 선호합니다. public static bool IsNumeric(this string text) { double _out; return double.TryParse(text, out _out); }
— Hamid Naeemi

350

input모든 숫자 이면 true를 반환합니다 . 보다 나은지 TryParse모르지만 작동합니다.

Regex.IsMatch(input, @"^\d+$")

하나 이상의 숫자가 문자와 혼합되어 있는지 알고 싶다면 ^ +및을 그대로 두십시오 $.

Regex.IsMatch(input, @"\d")

편집 : 실제로 매우 긴 문자열이 잠재적으로 TryParse를 오버플로 할 수 있기 때문에 TryParse보다 낫다고 생각합니다.


2
그래도 정규 표현식을 한 번에 작성하는 것이 훨씬 효율적입니다.
— Clément

2
@CFP +1 ... RegEx는 적용 가능한 경우 항상 일반 기능보다 우수합니다!
— MAXE

19
@MAXE : 동의하지 않습니다. 정규식 검사는 상당히 느리므로 성능을 고려중인 경우 종종 더 나은 솔루션이 있습니다.
— Michal B.

7
편집 : RegexOptions.Compiled가능한 속도 증가를 위해 수천 가지를 실행하는 경우 매개 변수로 추가 할 수 있습니다Regex.IsMatch(x.BinNumber, @"^\d+$", RegexOptions.Compiled)
— Simon_Weaver

9
또한 .
— Noctis가 다음

199

다음을 사용할 수도 있습니다.

stringTest.All(char.IsDigit);

그것은 반환 true모든 자리 숫자 (하지 않는 float) 및 false입력 문자열은 숫자의 어떤 종류 인 경우.

참고 : stringTest숫자 테스트를 통과하므로 빈 문자열이 아니어야합니다.


20
정말 멋지다. 한 가지 알아야 할 사항 : 빈 문자열은 해당 테스트를 숫자로 전달합니다.
— dan-gph

2
@ dan-gph : 다행입니다, 당신은 그것을 좋아합니다. 그래 정확 해. 위의 메모를 업데이트했습니다. 감사!
— Kunal Goel

1
소수의 경우에도 작동하지 않습니다. 올바른 테스트는 stringTest.All (l => char.IsDigit (l) || '.'== l || '-'== l)입니다.
— 살만 Hasrat 칸

입력 Salman에 감사드립니다. 문자열에서 10 진수를 구체적으로 확인하려면-if (Decimal.TryParse (stringTest2, out value)) {/ * Yes, Decimal /} else {/ No, Decimal이 아님 * / }
— Kunal Goel

6
Salman, 그것은 간단하지 않습니다-이것은 ..--..--유효한 숫자로 전달 됩니다. 분명히 아닙니다.
— Flynn1179

133

이 기능을 여러 번 사용했습니다.

public static bool IsNumeric(object Expression)
{
    double retNum;

    bool isNum = Double.TryParse(Convert.ToString(Expression), System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.InvariantInfo, out retNum);
    return isNum;
}

그러나 당신은 또한 사용할 수 있습니다;

bool b1 = Microsoft.VisualBasic.Information.IsNumeric("1"); //true
bool b2 = Microsoft.VisualBasic.Information.IsNumeric("1aa"); // false

에서 벤치마킹 ISNUMERIC 옵션

대체 텍스트
(출처 : aspalliance.com )

대체 텍스트
(출처 : aspalliance.com )


80
C # 앱에서 Microsoft.VisualBasic.dll을 참조하십니까? eww : P
— Lucas

"IsNumeric"을 사용하는 데 아무런 문제가 없습니다. 또한 TryParse와 IsNumeric간에 효율성 차이가 거의 없음을 알 수 있습니다. TryParse는 2.0의 새로운 기능이며 그 전에는 다른 전략보다 IsNumeric을 사용하는 것이 좋습니다.
— 넬슨 미란다

10
VB.NET의 IsNumeric ()은 내부적으로 VB6 호환성을 위해 필요한 많은 회전 후에 double.TryParse ()를 사용합니다. 호환성이 필요하지 않은 경우 double.TryParse ()는 사용하기 매우 간단하며 프로세스에 Microsoft.VisualBasic.dll을로드하여 메모리 낭비를 줄입니다.
— Euro Micelli

4
빠른 참고 : 기본 유한 상태 머신을 한 번에 구축하면 정규식을 사용하는 것이 훨씬 빠릅니다. 일반적으로 상태 머신을 구축하려면 O (2 ^ n)가 필요합니다. 여기서 n은 정규식의 길이이고 읽기는 O (k)입니다. 여기서 k는 검색 할 문자열의 길이입니다. 따라서 매번 정규 표현식을 다시 작성하면 편견이 생깁니다.
— Clément

2
@Lucas 실제로, 전체 CSV 파서와 같은 정말 멋진 것들이 있습니다. 그것이 존재한다면 그것을 사용하지 않을 이유가 없습니다.
— Nyerguds

32

아마도 C #에서 가장 좋은 옵션 일 것입니다.

문자열에 정수 (정수)가 포함되어 있는지 알고 싶은 경우 :

string someString;
// ...
int myInt;
bool isNumerical = int.TryParse(someString, out myInt);

TryParse 메소드는 문자열을 숫자 (정수)로 변환하려고 시도하며 성공하면 true를 리턴하고 해당 숫자를 myInt에 배치합니다. 그렇지 않으면 false를 반환합니다.

int.Parse(someString)다른 응답에 표시된 대안을 사용하는 솔루션 은 효과가 있지만 예외를 던지면 비용이 많이 들기 때문에 훨씬 느립니다. TryParse(...)버전 2의 C # 언어에 추가되었으며 그때까지는 선택의 여지가 없었습니다. 이제 당신은 : Parse()대안을 피해야합니다 .

소수를 허용하려면 소수 클래스에도 .TryParse(...)메소드가 있습니다. 위의 설명에서 int를 10 진수로 바꾸면 동일한 원칙이 적용됩니다.


모든 문자를 정수 문자와 비교하는 것보다 TryParse가 더 나은 이유는 무엇입니까?
— Arjang

25

많은 데이터 유형에 대해 항상 내장 된 TryParse 메소드를 사용하여 해당 문자열이 전달되는지 확인할 수 있습니다.

예.

decimal myDec;
var Result = decimal.TryParse("123", out myDec);

결과는 다음과 같습니다 = True

decimal myDec;
var Result = decimal.TryParse("abc", out myDec);

결과는 다음과 같습니다 = False


C #보다 VB 스타일 구문에서 더 많이했을 수도 있지만 동일한 규칙이 적용됩니다.
— TheTXI

22

int.Parse 또는 double.Parse를 사용하지 않으려는 경우 다음과 같이 자신의 롤을 만들 수 있습니다.

public static class Extensions
{
    public static bool IsNumeric(this string s)
    {
        foreach (char c in s)
        {
            if (!char.IsDigit(c) && c != '.')
            {
                return false;
            }
        }

        return true;
    }
}

7
정수만 의미한다면? '.'가있는 로케일은 어떻습니까? 쉼표 (예 : pt-Br)가 아닌 그룹 구분 기호입니까? 음수는 어떻습니까? 그룹 구분 기호 (영문 쉼표)? 통화 기호? TryParse ()는 NumberStyles 및 IFormatProvider를 사용하여 필요에 따라 이러한 모든 것을 관리 할 수 ​​있습니다.
— Lucas

네, All 버전이 더 좋습니다. 나는 실제로 그 확장 방법을 사용하지 않았다. s.ToCharArray (). All (..)이어야합니다. int.Parse를 사용하고 싶지 않다면 머리말을 듣게 된 이유는 다음과 같습니다.
— BFree

11
1.3.3.8.5는 실제로 숫자가 아니지만 1.23E5는 숫자입니다.
— Clément

4
논리에 결함이 있습니다. -1
— Russel Yang

1
@Lucas TryParse가 더 많은 것을 처리하지만 때로는 필요하지 않은 것에 동의합니다. 신용 카드 번호 상자의 유효성을 검사하면됩니다 (숫자 만 가능). 이 솔루션은 구문 분석보다 거의 빠릅니다.
— Millie Smith

14

더 넓은 범위의 숫자, 즉 PHP의 is_numeric 을 잡으려면 다음을 사용할 수 있습니다.

// From PHP documentation for is_numeric
// (http://php.net/manual/en/function.is-numeric.php)

// Finds whether the given variable is numeric.

// Numeric strings consist of optional sign, any number of digits, optional decimal part and optional
// exponential part. Thus +0123.45e6 is a valid numeric value.

// Hexadecimal (e.g. 0xf4c3b00c), Binary (e.g. 0b10100111001), Octal (e.g. 0777) notation is allowed too but
// only without sign, decimal and exponential part.
static readonly Regex _isNumericRegex =
    new Regex(  "^(" +
                /*Hex*/ @"0x[0-9a-f]+"  + "|" +
                /*Bin*/ @"0b[01]+"      + "|" + 
                /*Oct*/ @"0[0-7]*"      + "|" +
                /*Dec*/ @"((?!0)|[-+]|(?=0+\.))(\d*\.)?\d+(e\d+)?" + 
                ")$" );
static bool IsNumeric( string value )
{
    return _isNumericRegex.IsMatch( value );
}

단위 테스트 :

static void IsNumericTest()
{
    string[] l_unitTests = new string[] { 
        "123",      /* TRUE */
        "abc",      /* FALSE */
        "12.3",     /* TRUE */
        "+12.3",    /* TRUE */
        "-12.3",    /* TRUE */
        "1.23e2",   /* TRUE */
        "-1e23",    /* TRUE */
        "1.2ef",    /* FALSE */
        "0x0",      /* TRUE */
        "0xfff",    /* TRUE */
        "0xf1f",    /* TRUE */
        "0xf1g",    /* FALSE */
        "0123",     /* TRUE */
        "0999",     /* FALSE (not octal) */
        "+0999",    /* TRUE (forced decimal) */
        "0b0101",   /* TRUE */
        "0b0102"    /* FALSE */
    };

    foreach ( string l_unitTest in l_unitTests )
        Console.WriteLine( l_unitTest + " => " + IsNumeric( l_unitTest ).ToString() );

    Console.ReadKey( true );
}

값이 숫자라고해서 값이 숫자 유형으로 변환 될 수있는 것은 아닙니다. 예를 들어, "999999999999999999999999999999.9999999999"완전한 유효한 숫자 값이지만 .NET 숫자 유형 (표준 라이브러리에 정의 된 값이 아님)에는 맞지 않습니다.


여기서 현명한 알렉이 되려고하지는 않지만 문자열 "0"에는 실패한 것 같습니다. 내 정규식이 존재하지 않습니다. 그것에 대한 간단한 조정이 있습니까? 가능한 유효한 숫자로 "0"및 "0.0"및 "-0.0"이 표시됩니다.
— Steve Hibbert

@SteveHibbert- "0"은 숫자가 아니라는 것을 모두 알고 있습니다! 진지하게 .... 정규 표현식을 0과 일치하도록 조정했습니다.
— JDB는 여전히 Monica

흠, 나인가요, 아니면 "0"이 여전히 숫자로 인식되지 않습니까?
— Steve Hibbert

1
게으르고 정규식을 무시하기 때문에 위의 코드를 잘라 붙여 넣었습니다. 여기에는 "0.0"유형 변경이 포함 된 것처럼 보입니다. .IsNumeric ()을 실행하는 문자열 "0"을 확인하기 위해 테스트를 실행했으며 false를 반환합니다. Octal 테스트는 첫 번째 숫자가 0이고 두 번째 숫자는 0 ~ 7 인 두 개의 숫자 문자가있는 경우 true를 반환하지만 그 자체로는 큰 뚱뚱한 외로운 0에 대해 false를 반환한다고 생각합니다. 위의 코드로 "0"을 테스트하면 거짓이 발생합니까? 사과, 더 많은 정규 표현식을 알고 있다면 더 나은 피드백을 줄 수 있습니다. 읽어야합니다.
— Steve Hibbert

1
아! 위의 의견을 다시 읽으십시오. 추가 별표를 놓쳤습니다. 소수점 만 업데이트했습니다. 그 자리에 "0"IsNumeric이 맞습니다. Faffing에 대한 사과와 업데이트에 대단히 감사합니다. 다른 사람들에게도 도움이되기를 바랍니다. 감사합니다.
— Steve Hibbert

14

나는 이것이 오래된 스레드라는 것을 알고 있지만 비효율적이거나 쉽게 재사용 할 수 있도록 캡슐화되지 않은 대답은 실제로 나에게 도움이되지 못했습니다. 또한 문자열이 비어 있거나 null 인 경우 false를 반환했는지 확인하고 싶었습니다. 이 경우 TryParse는 true를 반환합니다 (빈 문자열은 숫자로 구문 분석 할 때 오류가 발생하지 않습니다). 자, 여기 내 문자열 확장 방법이 있습니다 :

public static class Extensions
{
    /// <summary>
    /// Returns true if string is numeric and not empty or null or whitespace.
    /// Determines if string is numeric by parsing as Double
    /// </summary>
    /// <param name="str"></param>
    /// <param name="style">Optional style - defaults to NumberStyles.Number (leading and trailing whitespace, leading and trailing sign, decimal point and thousands separator) </param>
    /// <param name="culture">Optional CultureInfo - defaults to InvariantCulture</param>
    /// <returns></returns>
    public static bool IsNumeric(this string str, NumberStyles style = NumberStyles.Number,
        CultureInfo culture = null)
    {
        double num;
        if (culture == null) culture = CultureInfo.InvariantCulture;
        return Double.TryParse(str, style, culture, out num) && !String.IsNullOrWhiteSpace(str);
    }
}

사용하기 쉬운 :

var mystring = "1234.56789";
var test = mystring.IsNumeric();

또는 다른 유형의 숫자를 테스트하려는 경우 '스타일'을 지정할 수 있습니다. 따라서 지수로 숫자를 변환하려면 다음을 사용할 수 있습니다.

var mystring = "5.2453232E6";
var test = mystring.IsNumeric(style: NumberStyles.AllowExponent);

또는 잠재적 16 진수 문자열을 테스트하려면 다음을 사용할 수 있습니다.

var mystring = "0xF67AB2";
var test = mystring.IsNumeric(style: NumberStyles.HexNumber)

선택적 'culture'매개 변수는 거의 같은 방식으로 사용할 수 있습니다.

더블에 포함하기에는 너무 큰 문자열을 변환 할 수 없기 때문에 제한적이지만 요구 사항이 제한되어 있으며 이보다 큰 숫자로 작업하는 경우 추가 특수 숫자 처리가 필요할 것입니다 어쨌든 기능.


2
Double.TryParse가 NumberStyles.HexNumber를 지원하지 않는 것을 제외하고는 훌륭하게 작동합니다. MSDN Double.TryParse를 참조하십시오. 어떤 이유로 IsNullOrWhiteSpace를 확인하기 전에 Parse를 시도해야합니까? IsNullOrWhiteSpace가 그렇지 않으면 TryParse가 false를 반환합니까?
— Harald Coppoolse

10

TryParse를 사용하여 문자열을 정수로 구문 분석 할 수 있는지 판별 할 수 있습니다.

int i;
bool bNum = int.TryParse(str, out i);

부울이 작동하는지 여부를 알려줍니다.


9

문자열이 숫자인지 확인하려면 (문자열이 숫자라고 가정하므로 문자열이라고 가정합니다.

  • 정규 표현식없이
  • Microsoft 코드를 가능한 많이 사용

당신은 또한 할 수 있습니다 :

public static bool IsNumber(this string aNumber)
{
     BigInteger temp_big_int;
     var is_number = BigInteger.TryParse(aNumber, out temp_big_int);
     return is_number;
}

이것은 일반적인 nasties를 돌볼 것입니다 :

  • 처음에 마이너스 (-) 또는 플러스 (+)
  • 십진 문자를 포함BigInteger는 소수점으로 숫자를 구문 분석하지 않습니다. (그래서 : BigInteger.Parse("3.3")예외를 던질 것이고 TryParse, 같은 경우 거짓을 반환 할 것입니다)
  • 숫자가 아닌 재미있는 숫자가 없습니다.
  • 숫자가 일반적인 용도보다 큰 경우를 포함합니다. Double.TryParse

클래스에 대한 참조를 추가하고 클래스 위에 System.Numerics있어야 using System.Numerics;합니다 (두 번째는 보너스라고 생각합니다 :)


8

나는이 대답이 다른 모든 것 사이에서 잃어 버릴 것이라고 생각하지만 어쨌든 여기에 간다.

나는이 있는지 확인하고 싶었 기 때문에 나는 구글을 통해이 질문에 결국 string있었다 numeric난 그냥 사용할 수 있도록 double.Parse("123")의 대신 TryParse()하는 방법.

왜? out변수 를 선언 TryParse()하고 구문 분석이 실패했는지 여부를 알기 전에 결과를 확인 해야하는 것이 성가시다 . 를 사용하여 is ternary operator인지 확인한 다음 첫 번째 삼항 식에서 구문 분석하거나 두 번째 삼항 식에서 기본값을 제공하고 싶습니다 .stringnumerical

이처럼 :

var doubleValue = IsNumeric(numberAsString) ? double.Parse(numberAsString) : 0;

다음보다 훨씬 깨끗합니다.

var doubleValue = 0;
if (double.TryParse(numberAsString, out doubleValue)) {
    //whatever you want to do with doubleValue
}

나는 extension methods이 경우를 위해 몇 가지 를 만들었습니다 .


확장 방법 1

public static bool IsParseableAs<TInput>(this string value) {
    var type = typeof(TInput);

    var tryParseMethod = type.GetMethod("TryParse", BindingFlags.Static | BindingFlags.Public, Type.DefaultBinder,
        new[] { typeof(string), type.MakeByRefType() }, null);
    if (tryParseMethod == null) return false;

    var arguments = new[] { value, Activator.CreateInstance(type) };
    return (bool) tryParseMethod.Invoke(null, arguments);
}

예:

"123".IsParseableAs<double>() ? double.Parse(sNumber) : 0;

IsParseableAs()문자열이 "숫자"인지 확인하는 대신 문자열을 적절한 유형으로 구문 분석하려고하기 때문에 꽤 안전해야합니다. 그리고 TryParse()방법 이있는 숫자가 아닌 유형에도 사용할 수 있습니다.DateTime .

이 방법은 리플렉션을 사용하고 결과적 TryParse()으로 효율적이지 않지만 모든 것을 완전히 최적화해야 할 필요는 없지만 때로는 편의성이 더 중요한 방법을 두 번 호출합니다 .

이 방법을 사용 double하면 예외를 잡을 필요없이 숫자 문자열 목록을 기본값 또는 다른 유형 의 목록으로 쉽게 구문 분석 할 수 있습니다 .

var sNumbers = new[] {"10", "20", "30"};
var dValues = sNumbers.Select(s => s.IsParseableAs<double>() ? double.Parse(s) : 0);

확장 방법 2

public static TOutput ParseAs<TOutput>(this string value, TOutput defaultValue) {
    var type = typeof(TOutput);

    var tryParseMethod = type.GetMethod("TryParse", BindingFlags.Static | BindingFlags.Public, Type.DefaultBinder,
        new[] { typeof(string), type.MakeByRefType() }, null);
    if (tryParseMethod == null) return defaultValue;

    var arguments = new object[] { value, null };
    return ((bool) tryParseMethod.Invoke(null, arguments)) ? (TOutput) arguments[1] : defaultValue;
}

이 확장 방법은 당신이 구문을 분석 할 수 string있는대로 typeA가 들어 그TryParse() 방법을 그리고 그것은 또한 당신이 변환이 실패 할 경우 반환 할 기본값을 지정할 수 있습니다.

이것은 변환 방법을 한 번만 수행하므로 위의 확장 방법으로 삼항 연산자를 사용하는 것보다 낫습니다. 그래도 여전히 반사를 사용합니다 ...

예 :

"123".ParseAs<int>(10);
"abc".ParseAs<int>(25);
"123,78".ParseAs<double>(10);
"abc".ParseAs<double>(107.4);
"2014-10-28".ParseAs<DateTime>(DateTime.MinValue);
"monday".ParseAs<DateTime>(DateTime.MinValue);

출력 :

123
25
123,78
107,4
28.10.2014 00:00:00
01.01.0001 00:00:00

4
내가 본 가장 비효율적 인 방법 중 하나를 발명했을 수도 있습니다. 문자열을 두 번 파싱 할 수있을뿐만 아니라 (구문 분석 가능한 경우) 리플렉션 함수를 여러 번 호출 하여 수행합니다. 그리고 결국에는 확장 방법을 사용하여 키 입력을 저장하지 않아도됩니다.
— JDB는 여전히 Monica

두 번째 단락에서 마지막 단락에 내가 쓴 내용을 반복 해 주셔서 감사합니다. 또한 마지막 예제를 고려하면이 확장 방법을 사용하여 키 입력을 확실히 저장할 수 있습니다. 이 답변은 어떤 문제에 대한 일종의 마술 해결책이라고 주장하지 않으며 단지 코드 예제 일뿐입니다. 사용하거나 사용하지 마십시오. 제대로 사용하면 편리하다고 생각합니다. 그리고 확장 방법과 리플렉션의 예가 포함되어 있습니다. 어쩌면 누군가가 배울 수 있습니다.
— Hein Andre Grønnestad

5
당신은 시도 했습니까 var x = double.TryParse("2.2", new double()) ? double.Parse("2.2") : 0.0;?
— JDB는 여전히 Monica

2
예, 작동하지 않습니다. Argument 2 must be passed with the 'out' keyword그리고 당신이 얻을 out뿐만 아니라 지정 하는 경우 . newA ref or out argument must be an assignable variable
— Hein Andre Grønnestad

1
성능 TryParse는 여기에 노출 된 모든 것보다 낫습니다. 결과 : TryParse 8 Regex 20 PHP IsNumeric 30 반영 TryParse 31 테스트 코드 dotnetfiddle.net/x8GjAF
— prampe

7

문자열이 숫자인지 알고 싶다면 항상 구문 분석을 시도 할 수 있습니다.

var numberString = "123";
int number;

int.TryParse(numberString , out number);

참고 TryParse리턴한다 bool파싱가 성공했을 경우 사용할 수있는, 확인.



4

Kunal Noel 답변 업데이트

stringTest.All(char.IsDigit);
// This returns true if all characters of the string are digits.

그러나이 경우 빈 문자열이 해당 테스트를 통과하므로 다음을 수행 할 수 있습니다.

if (!string.IsNullOrEmpty(stringTest) && stringTest.All(char.IsDigit)){
   // Do your logic here
}

4

.net 내장 기능을 갖춘 최고의 유연한 솔루션- char.IsDigit. 무제한 긴 숫자로 작동합니다. 각 문자가 숫자 인 경우에만 true를 리턴합니다. 나는 문제없이 많은 시간을 사용했고 내가 찾은 훨씬 더 깨끗한 솔루션을 찾았습니다. 예제 방법을 만들었습니다. 사용할 준비가되었습니다. 또한 null 및 빈 입력에 대한 유효성 검사를 추가했습니다. 그래서이 방법은 이제 완전히 방탄입니다

public static bool IsNumeric(string strNumber)
    {
        if (string.IsNullOrEmpty(strNumber))
        {
            return false;
        }
        else
        {
            int numberOfChar = strNumber.Count();
            if (numberOfChar > 0)
            {
                bool r = strNumber.All(char.IsDigit);
                return r;
            }
            else
            {
                return false;
            }
        }
    }

2

c # 7을 사용하면 out 변수를 인라인 할 수 있습니다.

if(int.TryParse(str, out int v))
{
}

2

문자열이 숫자 인지, 문자열 에 0-9 자리 만 포함되어 있는지 확인하려면 이러한 확장 방법을 사용하십시오.

public static class ExtensionMethods
{
    /// <summary>
    /// Returns true if string could represent a valid number, including decimals and local culture symbols
    /// </summary>
    public static bool IsNumeric(this string s)
    {
        decimal d;
        return decimal.TryParse(s, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.CurrentCulture, out d);
    }

    /// <summary>
    /// Returns true only if string is wholy comprised of numerical digits
    /// </summary>
    public static bool IsNumbersOnly(this string s)
    {
        if (s == null || s == string.Empty)
            return false;

        foreach (char c in s)
        {
            if (c < '0' || c > '9') // Avoid using .IsDigit or .IsNumeric as they will return true for other characters
                return false;
        }

        return true;
    }
}

2
public static bool IsNumeric(this string input)
{
    int n;
    if (!string.IsNullOrEmpty(input)) //.Replace('.',null).Replace(',',null)
    {
        foreach (var i in input)
        {
            if (!int.TryParse(i.ToString(), out n))
            {
                return false;
            }

        }
        return true;
    }
    return false;
}

1

도움이 되었기를 바랍니다

string myString = "abc";
double num;
bool isNumber = double.TryParse(myString , out num);

if isNumber 
{
//string is number
}
else
{
//string is not a number
}

0

프로젝트에서 Visual Basic에 대한 참조를 가져 와서 아래에 표시된 것과 같은 Information.IsNumeric 메서드를 사용하고 위의 정수만 잡는 위의 답변과 달리 부동 소수점뿐만 아니라 정수를 캡처 할 수 있습니다.

    // Using Microsoft.VisualBasic;

    var txt = "ABCDEFG";

    if (Information.IsNumeric(txt))
        Console.WriteLine ("Numeric");

IsNumeric("12.3"); // true
IsNumeric("1"); // true
IsNumeric("abc"); // false

이 방법의 잠재적 문제점 IsNumeric은 문자열의 문자 분석을 수행한다는 것입니다. 따라서 표준 숫자 유형을 사용하여이 숫자를 표시 할 방법이 없지만와 같은 숫자 9999999999999999999999999999999999999999999999999999999999.99999999999는로 등록됩니다 True.
— JDB는 여전히 Monica

0

아래의 리지를 사용해보십시오

new Regex(@"^\d{4}").IsMatch("6")    // false
new Regex(@"^\d{4}").IsMatch("68ab") // false
new Regex(@"^\d{4}").IsMatch("1111abcdefg") ```

0

모든 답변이 유용합니다. 그러나 Numeric 값이 12 자리 이상인 솔루션을 검색하는 동안 (필자의 경우) 디버깅하는 동안 다음 솔루션이 유용하다는 것을 알았습니다.

double tempInt = 0;
bool result = double.TryParse("Your_12_Digit_Or_more_StringValue", out tempInt);

이 결과 변수는 true 또는 false를 제공합니다.



-7
//To my knowledge I did this in a simple way
static void Main(string[] args)
{
    string a, b;
    int f1, f2, x, y;
    Console.WriteLine("Enter two inputs");
    a = Convert.ToString(Console.ReadLine());
    b = Console.ReadLine();
    f1 = find(a);
    f2 = find(b);

    if (f1 == 0 && f2 == 0)
    {
        x = Convert.ToInt32(a);
        y = Convert.ToInt32(b);
        Console.WriteLine("Two inputs r number \n so that addition of these text box is= " + (x + y).ToString());
    }
    else
        Console.WriteLine("One or two inputs r string \n so that concatenation of these text box is = " + (a + b));
    Console.ReadKey();
}

static int find(string s)
{
    string s1 = "";
    int f;
    for (int i = 0; i < s.Length; i++)
       for (int j = 0; j <= 9; j++)
       {
           string c = j.ToString();
           if (c[0] == s[i])
           {
               s1 += c[0];
           }
       }

    if (s == s1)
        f = 0;
    else
        f = 1;

    return f;
}

1
4 명의 다운 보트지만 아무도 왜 그런 말을하지 않았습니까? TryParse / Parse가 더 나은 옵션 일 것이라고 생각하지만 여기에 오는 모든 사람이이를 알지는 못할 것입니다.
— njplumridge

2
당신은 너무 복잡하게 만들었습니다. 심지어 C 프로그래머조차도 "쉬워, 더 쉽게 쓸 수있는 방법이 있어야합니다"
— Ch3shire

1. 콘솔에서 두 개의 숫자를 읽고 추가 할 이유가 없습니다. 문자열의 출처는 어쨌든 관련이 없으므로 콘솔에서 아무것도 읽지 않아도됩니다.
— Algoman

2. f에 대한 변수는 불필요합니다. 0 또는 1을 직접 반환 할 수 있습니다. 단일 반환을 원하면 삼항 연산자를 사용할 수 있습니다. INT는 발견에 대한 잘못된 반환 형식, 그것은 부울이어야하며 당신의 == S1 반환 할 수
— Algoman

3. s의 숫자를 s1에 복사 한 다음 s를 s1과 비교합니다. 이것은 필요한 것보다 훨씬 느립니다. 또한 c [0] == s [i]가 발생하더라도 왜 내부 루프를 계속합니까? s [i]도 다른 숫자와 같을 것으로 예상됩니까?
— Algoman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.