C # - Проверьте, является ли введенная строка целым числом или нет - PullRequest
0 голосов
/ 18 ноября 2018

я хочу проверить, является ли введенная строка целым числом или нет, например,

12 = True

+ 12 = True

-5= True

4.4 = False
4as = False

Я делаю это с помощью int.TryParse, но я хочу использовать ASCII без использования int.TryParse

string str;
int strint;
int strintoA;
bool flag = false;

while (flag == false)
{
    Console.Write("Enter a Number : ");
    str = Console.ReadLine();
    flag = int.TryParse(str, out strint);              
    if (flag == false)
    {
        Console.WriteLine("Please Enter Numbers Only.");
    }
    else
    {
        strintoA = strint;
        Console.WriteLine("Entered String: " + str + " is a Number!" );
        break;
    }
}
Console.ReadKey();

Ответы [ 6 ]

0 голосов
/ 18 ноября 2018

Из ваших требований выясняется, что вы хотите использовать код ASCII для подтверждения того, является ли введенная строка числовой или нет.

Вот код, который я придумал:

 string str;
    var index = 1;
    int strintoA = 0;
    bool isNegative = false;

    //ASCII list of numbers and signs
    List<int> allowedValues = new List<int> { 43, 45, 48, 49, 50, 51, 52, 53, 54, 55, 56, 
    57 };
    bool flag = false;

    while (!flag)
    {
        Console.WriteLine("Enter a Number : ");

        str = Console.ReadLine();

        if (str.Count(item => allowedValues.Contains((int)item)) == str.Count())
        {
            foreach (var item in str.Reverse())
            {               
                if (item != 43 && item != 45)
                {
                    strintoA += index * (item - 48);
                    index = index * 10;
                }
                else if(item == 45)
                {
                    isNegative = true;
                }
            }
            if(isNegative)
            {
                strintoA *= -1;
            }

            Console.WriteLine("Entered String: " + str + " is a Number!");
            flag = true;
        }
        else
        {
            Console.WriteLine("Please Enter Numbers Only.");
        }
    }
    Console.ReadKey();
}

Список позволенных значений содержит ASCII-представление числовых значений и разрешенных знаков (+ и -). Цикл foreach восстановит вставленное значение int.

Надеюсь, это поможет.

0 голосов
/ 18 ноября 2018

К вашему сведению: вы можете реорганизовать свой код, чтобы упростить его для точно такого же функционального вывода:

void Main()
{
    int result;
    Console.Write("Enter a Number : ");
    while (!int.TryParse(Console.ReadLine(), out result))
    {
        Console.WriteLine("Please Enter Numbers Only.");
        Console.Write("Enter a Number : ");
    }
    Console.WriteLine($"Entered String: {result} is a Number!");
    Console.ReadKey();
}

Если у вас есть веская причина не использовать int.TryParse (например, ему не хватает какой-либо функциональности или это упражнение, в котором вас попросили написать свой собственный), вы можете использовать вышеприведенную замену int.TryParse вызовом на IsNumericCustom, принимая указанную ниже подпись (или измените тип int на любой тип данных, который вам нужно обработать).

public bool IsNumericCustom(string input, out int output)
{
    //...
}

Или, если вам важно только числовое значение, а не анализируемое значение:

void Main()
{
    string result;
    Console.Write("Enter a Number : ");
    //while (!int.TryParse((result = Console.ReadLine()), out _))
    while (!IsNumericCustom((result = Console.ReadLine()))
    {
        Console.WriteLine("Please Enter Numbers Only.");
        Console.Write("Enter a Number : ");
    }
    Console.WriteLine($"Entered String: {result} is a Number!");
    Console.ReadKey();
}

public bool IsNumericCustom(string input)
{
    //...
}

Что касается логики в IsNumericCustom, то она действительно зависит от того, чего вы надеетесь достичь / почему int.TryParse / decimal.TryParse и т. Д. Не подходят. Вот пара реализаций (с использованием разных имен функций).

using System.Text.RegularExpressions; //https://docs.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.regex?view=netframework-4.7.2
//...
readonly Regex isNumeric = new Regex("^[+-]?\d*\.?\d*$", RegexOptions.Compiled); //treat "." as "0.0", ".9" as "0.9", etc
readonly Regex isInteger = new Regex("^[+-]?\d+$", RegexOptions.Compiled); //requires at least 1 digit; i.e. "" is not "0" 
readonly Regex isIntegerLike = new Regex("^[+-]?\d*\.?\0*$", RegexOptions.Compiled); //same as integer, only 12.0 is treated as 12, whilst 12.1 is invalid; i.e. only an integer if we can remove digits after the decimal point without truncating the value.

//...
public bool IsNumeric(string input)
{
    return isNumeric.IsMatch(input); //if you'd wanted 4.4 to be true, use this
}
public bool IsInteger(string input)
{
    return isInteger.IsMatch(input); //as you want 4.4 to be false, use this
}
public bool IsIntegerLike(string input)
{
    return isIntegerLike.IsMatch(input); //4.4 is false, but both 4 and 4.0 are true 
}
0 голосов
/ 18 ноября 2018

Не знаю, почему вы не хотите использовать int.TryParse, но должен делать следующий код:

static bool IsValidInteger(string s)
{
    var leadingSignSeen = false;
    var digitSeen = false;
    var toParse = s.Trim();

    foreach (var c in toParse)
    {
        if (c ==  ' ')
        {
            if (digitSeen)
                return false;
        }
        else if (c == '+' || c == '-')
        {
            if (leadingSignSeen || digitSeen)
                return false;

            leadingSignSeen = true;
        }
        else if (!char.IsDigit(c))
            return false;
        else
        {
            digitSeen = true;
        }
    }

    return true;
}

Это будет принимать любое целое число с начальным и последним пробелами.Пробелы между начальным знаком и цифрами также принимаются.

0 голосов
/ 18 ноября 2018

Вы также можете использовать регулярные выражения:

var regex = new Regex(@"^[-+]?\d+$");
var str = Console.ReadLine();
if (regex.IsMatch(str))
{
    Console.WriteLine($"{str} is a number!");
}
0 голосов
/ 18 ноября 2018

проверьте первый символ на - | + | цифру, проверьте остаток isDigit

for (int i = 0; i < str.Length; i++)
{
    var c = str[i];
    if (i == 0)
    {
        if (!(c == '+' || c == '-' || char.IsDigit(c)) {
            return false;
        }
    }

    if (!char.IsDigit(c)) return false;
}
return true;
0 голосов
/ 18 ноября 2018

почему не используете:

if(intString[0] == '+' || intString[0] == '-') intString = intString.Substring(1, intString.Length - 1);
bool isNumber = intString.All(char.IsDigit);
...