Identifique se uma sequência é um número


731

Se eu tiver essas strings:

  1. "abc" = false

  2. "123" = true

  3. "ab2" = false

Existe um comando, como IsNumeric()algo assim, que pode identificar se uma string é um número válido?


79
a partir de seus exemplos, você pode ver o que eles quiseram dizer se a sequência inteira representar um número.
2127 Lucas

47
return str.All (Char.IsDigit);
Mohsen 23/10

13
str.All (Char.IsDigit) declarará "3.14" false, bem como "-2" e "3E14". Para não falar de: "0x10"
Harald Coppoolse

4
Depende do tipo de número que você está tentando verificar. Para números inteiros sem separador (ou seja, cadeias de dígitos decimais), essa verificação funciona e é a mesma da resposta aceita e a implícita no OP.
Alex Mazzariol

1
@Lucas obrigado pelo seu comentário, você não tem idéia de quanto tempo eu venho tentando analisar uma cadeia dupla como um int e perguntando por que ele estava falhando ...
Novastorm

Respostas:


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

Atualizar a partir do C # 7:

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

ou se você não precisar do número, pode descartar o parâmetro out

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

Os var s podem ser substituídos por seus respectivos tipos!


126
No entanto, eu usaria double.TryParse, pois queremos saber se ele representa um número.
John Gietzen

5
A função retornará true se eu passar a string como "-123" ou "+123". Eu entendo que o número inteiro tem valores positivos e negativos. Porém, se essa sequência for proveniente da caixa de texto inserida pelo usuário, ela deverá retornar false.
user2323308

9
Esta é uma boa solução, até que um usuário entra em um valor além 2,147,483,648 a 2.147.483.647, e então essa falha silenciosamente
BlackTigerX

tente analisar 0,60 (que é uma vírgula!) é um número inválido, mas será analisado como 60!
Paul Zahra

2
Eu prefiro ter o método de extensão para esta verificação: public static bool IsNumeric(this string text) { double _out; return double.TryParse(text, out _out); }
Hamid Naeemi

350

Isso retornará verdadeiro se inputhouver todos os números. Não sei se é melhor do que isso TryParse, mas funcionará.

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

Se você quiser apenas saber se ele possui um ou mais números misturados com caracteres, deixe de ^ +e $.

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

Edit: Na verdade, acho que é melhor que o TryParse, porque uma string muito longa pode potencialmente exceder o TryParse.


2
Construir a regex de uma vez por todas seria muito mais eficiente.
Clément

2
@ CFP +1 ... RegEx são sempre melhores que as funções usuais, quando aplicável!
MAXE

19
@ MAXE: Eu não concordo. As verificações de expressão regular são bastante lentas, portanto, geralmente existem soluções melhores se o desempenho estiver em consideração.
Michal B.

7
edit: você pode adicionar RegexOptions.Compiledcomo um parâmetro se você estiver executando milhares destes para um possível aumento de velocidadeRegex.IsMatch(x.BinNumber, @"^\d+$", RegexOptions.Compiled)
Simon_Weaver

9
também irá falhar em negativos e as coisas com.
Noctis

199

Você também pode usar:

stringTest.All(char.IsDigit);

Ele retornará truepara todos os dígitos numéricos (não float) e falsese a string de entrada for algum tipo de alfanumérico.

Observe : stringTestnão deve ser uma string vazia, pois isso passaria no teste de ser numérico.


20
Isso é muito legal. Porém, uma coisa deve estar ciente: uma string vazia passará nesse teste como sendo numérica.
precisa

2
@ dan-gph: Estou feliz, você gosta. Sim você está correto. Eu atualizei a nota acima. Obrigado!
Kunal Goel

1
isso também não funciona para maiúsculas e minúsculas. O teste correto será stringTest.All (l => char.IsDigit (l) || '.' == l || '-' == l);
Salman Hasrat Khan

Obrigado pela sua entrada Salman. Para verificar especificamente decimal de uma string, você pode ir para - if (Decimal.TryParse (stringTest2, valor de saída)) {/ * Sim, decimal /} else {/ não, não um decimal * / }
Kunal Goel

6
Salman, não é tão simples - isso passaria ..--..--como um número válido. Claramente não.
Flynn1179

133

Eu usei essa função várias vezes:

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;
}

Mas você também pode usar;

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

A partir de Benchmarking Opções IsNumeric

texto alternativo
(fonte: aspalliance.com )

texto alternativo
(fonte: aspalliance.com )


80
referenciando Microsoft.VisualBasic.dll a partir de c # app? eww: P
Lucas

Não tenho nenhum problema em usar "IsNumeric", ele funciona bem. Além disso, você pode ver que há pouca diferença de eficiência entre o TryParse e o IsNumeric. Lembre-se de que o TryParse é novo na versão 2.0 e, antes disso, era melhor usar IsNumeric do que qualquer outra estratégia.
1913 Nelson Miranda

10
Bem, IsNumeric () do VB.NET usa internamente double.TryParse (), depois de várias rodadas necessárias (entre outras coisas) para compatibilidade com o VB6. Se você não precisar de compatibilidade, o double.TryParse () é igualmente simples de usar e evita que você desperdice memória carregando o Microsoft.VisualBasic.dll em seu processo.
Euro Micelli

4
Nota rápida: o uso de uma expressão regular será muito mais rápido se você conseguir construir a máquina de estado finito subjacente de uma vez por todas. Geralmente, a construção da máquina de estados leva O (2 ^ n) onde n é o comprimento da regex, enquanto a leitura é O (k) onde k é o comprimento da cadeia de caracteres que está sendo pesquisada. Portanto, a reconstrução do regex sempre que introduz um viés.
Clément

2
@ Lucas Na verdade, há algumas coisas muito legais por aí, como um analisador csv completo. Não há razão para não usá-lo, se existir lá.
Nyerguds

32

Esta é provavelmente a melhor opção em c #.

Se você deseja saber se a sequência contém um número inteiro (número inteiro):

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

O método TryParse tentará converter a seqüência de caracteres em um número (número inteiro) e, se for bem-sucedido, retornará true e colocará o número correspondente em myInt. Se não puder, retorna falso.

As soluções que utilizam a int.Parse(someString)alternativa mostrada em outras respostas funcionam, mas são muito mais lentas, porque lançar exceções é muito caro. TryParse(...)foi adicionado ao idioma C # na versão 2 e até então você não tinha escolha. Agora você faz: você deve, portanto, evitar oParse() alternativa.

Se você deseja aceitar números decimais, a classe decimal também possui um .TryParse(...)método. Substitua int por decimal na discussão acima, e os mesmos princípios se aplicam.


Por que o TryParse é melhor do que comparar todos os caracteres com caracteres inteiros?
jimjim

25

Você sempre pode usar os métodos TryParse incorporados para muitos tipos de dados para verificar se a sequência em questão será aprovada.

Exemplo.

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

O resultado seria então = True

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

O resultado seria então = False


Eu acho que posso ter feito mais isso na sintaxe do estilo VB do que o C #, mas as mesmas regras se aplicam.
TheTXI

22

Caso você não queira usar int.Parse ou double.Parse, você pode criar o seu próprio com algo como isto:

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
E se eles significassem apenas números inteiros? E quanto aos locais onde '.' é o separador de grupo, não a vírgula (por exemplo, pt-Br)? e os números negativos? separadores de grupo (vírgulas em inglês)? símbolos de moeda? TryParse () pode gerenciar tudo isso conforme necessário, usando NumberStyles e IFormatProvider.
2127 Lucas

Ooh sim, eu gosto mais da versão All. Na verdade, nunca usei esse método de extensão, boa ligação. Embora deva ser s.ToCharArray (). Todos (..). Quanto ao seu segundo ponto, eu ouvi você, e é por isso que eu prefacei se você não quiser usar int.Parse .... (o que eu suponho que tenha mais despesas ...)
BFree

11
1.3.3.8.5 não é realmente um número, enquanto 1.23E5 é.
Clément

4
a lógica é falha. -1
Russel Yang

1
@ Lucas Concordo que o TryParse lida com mais, mas às vezes isso não é necessário. Só preciso validar as caixas de número do meu cartão de crédito (que só podem ter dígitos). Esta solução é quase definitivamente mais rápida do que tentar analisar.
Millie Smith

14

Se você deseja capturar um espectro mais amplo de números, como is_numeric do PHP , pode usar o seguinte:

// 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 );
}

Teste de unidade:

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 );
}

Lembre-se de que o fato de um valor ser numérico não significa que ele pode ser convertido em um tipo numérico. Por exemplo, "999999999999999999999999999999.9999999999"é um valor numérico válido perfeitamente, mas não se encaixa em um tipo numérico do .NET (não definido na biblioteca padrão).


Não tentando ser um alec inteligente aqui, mas isso parece falhar na sequência "0". Meu Regex é inexistente. Existe um ajuste simples para isso? Eu obtenho "0" e possivelmente "0,0" e até "-0,0" como possíveis números válidos.
Steve Hibbert

@ SteveHibbert - Todo mundo sabe que "0" não é um número! Sério, porém ... ajustei o regex para corresponder a 0.
JDB ainda se lembra de Monica

Hmmm, sou eu ou o "0" ainda não é reconhecido como numérico?
Steve Hibbert

1
Sendo preguiçoso e ignorando as expressões regulares, eu recolhi o código acima, que parece incluir a alteração do tipo "0.0". Eu executei um teste para verificar se uma string "0" executando .IsNumeric () e que retorna false. Estou pensando que o teste Octal retornará verdadeiro para qualquer coisa que tenha dois caracteres numéricos, onde o primeiro é zero (e o segundo é zero a sete), mas retornará falso por apenas um zero solitário e gordo. Se você testar "0", com o código acima, será falso? Desculpas, se eu soubesse mais regex, seria capaz de dar um feedback melhor. Deve ler.
Steve Hibbert

1
Doh! Basta reler o seu comentário acima, eu tinha perdido o asterisco adicional, apenas atualizei a linha decimal. Com isso, você está certo, "0" IsNumeric. Pedimos desculpas pelo desrespeito e muito obrigado pela atualização, espero que ajude outras pessoas também. Muito grato.
Steve Hibbert

14

Sei que esse é um tópico antigo, mas nenhuma das respostas realmente fez isso por mim - ineficiente ou não encapsulado para facilitar a reutilização. Eu também queria garantir que ele retornasse false se a string estivesse vazia ou nula. TryParse retorna true nesse caso (uma cadeia vazia não causa um erro ao analisar como um número). Então, aqui está o meu método de extensão de string:

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);
    }
}

Simples de usar:

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

Ou, se você quiser testar outros tipos de número, poderá especificar o 'estilo'. Portanto, para converter um número com um expoente, você pode usar:

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

Ou, para testar uma potencial sequência Hex, você pode usar:

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

O parâmetro opcional 'cultura' pode ser usado da mesma maneira.

É limitado por não ser capaz de converter cadeias grandes demais para serem contidas em um duplo, mas isso é um requisito limitado e acho que se você estiver trabalhando com números maiores que isso, provavelmente precisará de um tratamento especializado adicional. funciona de qualquer maneira.


2
Funciona muito bem, exceto que Double.TryParse não oferece suporte a NumberStyles.HexNumber. Consulte MSDN Double.TryParse. Qualquer motivo para você TryParse antes de verificar IsNullOrWhiteSpace? TryParse retorna false se IsNullOrWhiteSpace não é?
Harald Coppoolse

10

Você pode usar o TryParse para determinar se a sequência pode ser analisada em um número inteiro.

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

O booleano dirá se funcionou ou não.


9

Se você quiser verificar se uma string é um número (suponho que seja uma string, pois se for um número, você sabe que é uma).

  • Sem regex e
  • usando o código da Microsoft, tanto quanto possível

você também pode fazer:

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

Isso cuidará dos problemas comuns:

  • Menos (-) ou Mais (+) no início
  • contém caracteres decimaisBigIntegers não analisará números com pontos decimais. (Então: BigInteger.Parse("3.3")lançará uma exceção eTryParse pelo mesmo, retornará falso)
  • sem dígitos engraçados
  • abrange casos em que o número é maior que o uso usual de Double.TryParse

Você terá que adicionar uma referência System.Numericse ter using System.Numerics;no topo da sua classe (bem, o segundo é um bônus, eu acho :)


8

Eu acho que essa resposta será perdida entre todas as outras, mas de qualquer maneira, aqui vai.

Acabei com essa pergunta pelo Google porque queria verificar se a stringera numericpara que eu pudesse usar em double.Parse("123")vez do TryParse()método.

Por quê? Porque é irritante ter que declarar uma outvariável e verificar o resultado TryParse()antes que você saiba se a análise falhou ou não. Eu quero usar o ternary operatorpara verificar se o stringé numericale apenas analisá-lo na primeira expressão ternária ou fornecer um valor padrão na segunda expressão ternária.

Como isso:

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

É muito mais limpo do que:

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

Fiz alguns extension methodspara estes casos:


Método de extensão um

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);
}

Exemplo:

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

Como IsParseableAs()tenta analisar a sequência como o tipo apropriado, em vez de apenas verificar se a sequência é "numérica", deve ser bastante seguro. E você pode até usá-lo para tipos não numéricos que possuem um TryParse()método, comoDateTime .

O método usa reflexão e você acaba chamando o TryParse()método duas vezes, o que, obviamente, não é tão eficiente, mas nem tudo precisa ser totalmente otimizado; às vezes, a conveniência é apenas mais importante.

Esse método também pode ser usado para analisar facilmente uma lista de seqüências numéricas em uma lista de doubleou outro tipo com um valor padrão sem a necessidade de capturar nenhuma exceção:

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

Método de extensão dois

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;
}

Esse método de extensão permite analisar a stringcomo qualquer um typeque tenha umaTryParse() método e também permite especificar um valor padrão a ser retornado se a conversão falhar.

Isso é melhor do que usar o operador ternário com o método de extensão acima, pois ele faz a conversão apenas uma vez. Ainda usa reflexão ...

Exemplos:

"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);

Saídas:

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

4
Acredito que você pode ter inventado uma das abordagens mais ineficientes que já vi. Você não apenas está analisando a string duas vezes (no caso em que é analisável), mas também está chamando funções de reflexão várias vezes para fazê-lo. E, no final, você nem salva as teclas pressionadas usando o método de extensão.
JDB ainda se lembra de Monica

Obrigado por repetir o que escrevi no segundo ao último parágrafo. Além disso, se você levar em consideração meu último exemplo, você definitivamente salvará as teclas pressionadas usando este método de extensão. Esta resposta não afirma ser um tipo de solução mágica para qualquer problema, é apenas um exemplo de código. Use ou não. Eu acho que é conveniente quando usado corretamente. E inclui exemplos de métodos de extensão e reflexão, talvez alguém possa aprender com isso.
Hein Andre Grønnestad 25/03

5
Você já tentou var x = double.TryParse("2.2", new double()) ? double.Parse("2.2") : 0.0;?
JDB ainda se lembra de Monica

2
Sim, e não funciona. Argument 2 must be passed with the 'out' keyworde se você especificar outo melhor newque conseguir A ref or out argument must be an assignable variable.
Hein Andre Grønnestad 22/10/2015

1
Desempenho O TryParse é melhor do que todos os expostos aqui. Resultados: TryParse 8 Regex 20 PHP IsNumeric 30 reflexões TryParse 31 Código de teste dotnetfiddle.net/x8GjAF
prampe

7

Se você quiser saber se uma sequência é um número, tente sempre analisá-la:

var numberString = "123";
int number;

int.TryParse(numberString , out number);

Observe que TryParseretorna a bool, que você pode usar para verificar se sua análise foi bem-sucedida.



4

ATUALIZAÇÃO da resposta de Kunal Noel

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

Mas, nesse caso, temos que cadeias vazias passarão no teste; portanto, você pode:

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

4

A melhor solução flexível com a função incorporada .net chamada- char.IsDigit. Funciona com números longos ilimitados. Só retornará true se cada caractere for um número numérico. Usei-o muitas vezes sem problemas e com uma solução muito mais limpa que encontrei. Eu fiz um método de exemplo. Está pronto para usar. Além disso, adicionei validação para entrada nula e vazia. Portanto, o método agora é totalmente à prova de balas

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

Com o c # 7, você pode incorporar a variável out:

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

2

Use esses métodos de extensão para distinguir claramente entre uma verificação se a sequência é numérica e se a sequência contém apenas de 0 a 9 dígitos

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

Espero que isto ajude

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

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

0

Puxe uma referência ao Visual Basic em seu projeto e use o método Information.IsNumeric, como mostrado abaixo, e possa capturar carros alegóricos e números inteiros, ao contrário da resposta acima, que captura apenas ints.

    // Using Microsoft.VisualBasic;

    var txt = "ABCDEFG";

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

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

Um problema potencial com essa abordagem é que IsNumericfaz uma análise de caracteres da string. Portanto, um número como 9999999999999999999999999999999999999999999999999999999999.99999999999será registrado como True, mesmo que não haja maneira de representá-lo usando um tipo numérico padrão.
JDB ainda se lembra de Monica

0

Experimente as regras abaixo

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

0

Todas as respostas são úteis. Mas, ao procurar uma solução em que o valor numérico tenha 12 dígitos ou mais (no meu caso), durante a depuração, achei a seguinte solução útil:

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

A variável de resultado fornecerá verdadeiro ou falso.



-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
Quatro votos negativos, mas ninguém disse por quê? Presumo que é porque TryParse / Parse seria uma opção melhor, mas nem todos que vêm aqui sabem disso.
Njplumridge 26/05

2
Você tornou tão complicado que mesmo programador C diria "Deus, tem de haver uma maneira mais fácil de escrever que"
Ch3shire

1. Não há razão para ler DOIS números no console e adicioná-los. De qualquer forma, a origem da string é irrelevante; portanto, não há razão para ler nada do console.
Algoman

2. A variável para f é desnecessária; você pode retornar 0 ou 1 diretamente - se desejar um único retorno, poderá usar o operador ternário para isso. int é também o tipo de retorno errado para achado, deve ser bool e você poderia voltar s == S1
Algoman

3. você copia os dígitos de s para s1 e depois compara s para s1. Isso é muito mais lento do que precisa ser. Além disso, por que você continua o loop interno, mesmo que c [0] == s [i] tenha acontecido? Você espera que s [i] seja igual a outros dígitos também?
Algoman
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.