문자열이 숫자인지 식별


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.