Как я могу преобразовать строку в Int?


638

У меня есть, TextBoxD1.Textи я хочу преобразовать его в, intчтобы сохранить его в базе данных.

Как я могу это сделать?

Ответы:


1039

Попробуй это:

int x = Int32.Parse(TextBoxD1.Text);

или еще лучше:

int x = 0;

Int32.TryParse(TextBoxD1.Text, out x);

Кроме того, поскольку Int32.TryParseвозвращает a, boolвы можете использовать его возвращаемое значение для принятия решения о результатах попытки синтаксического анализа:

int x = 0;

if (Int32.TryParse(TextBoxD1.Text, out x))
{
    // you know that the parsing attempt
    // was successful
}

Если вам интересно, разница между ParseиTryParse лучше всего подытожить так:

Метод TryParse похож на метод Parse, за исключением того, что метод TryParse не выдает исключение, если преобразование завершается неудачно. Это устраняет необходимость использовать обработку исключений для проверки на исключение FormatException в случае, если s является недопустимым и не может быть успешно проанализирован. - MSDN


3
Что, если целое число 64-разрядное или выглядит как «aslkdlksadjsd»? Это все еще безопасно?
Джонни

6
@Jonny Int64.Parse(). Если входные данные не являются int, то вы получите execption и трассировку стека с Int64.Parse, или логическое значение Falseс Int64.TryParse(), так что вам понадобится оператор if, например if (Int32.TryParse(TextBoxD1.Text, out x)) {}.

1
Вы также можете попытаться инициализировать переменную в TryParse, если она будет использоваться только внутри условия успеха. Например: Int32.TryParse (TextBoxD1.Text, out int x))
Сиб

5
Может быть, это невероятно очевидно для всех остальных, но для нубийских людей то, что делает «out x», устанавливает значение x равным string-cast-as-integer, если приведение прошло успешно. Т.е. в этом случае x = 0, если строка содержит нецелые символы, или x = значение string-as-integer в противном случае. Итак, самое интересное в том, что это одно короткое выражение, которое сообщает вам, успешно ли приведено преобразование, и сохраняет целое число приведения в переменную одновременно. Очевидно, что вы часто хотели бы продолжить выше строки с «иначе {// анализируемая строка не является целым числом, поэтому некоторый код для обработки этой ситуации}»
Уилл Кроксфорд

@Roberto хорошо, но возможно, что пользователь (либо по ошибке, либо намеренно) введет такое значение «aslkdlksadjsd» внутри текстового поля! так должна ли наша программа зависать?
С.Серпушан

55
Convert.ToInt32( TextBoxD1.Text );

Используйте это, если вы уверены, что содержимое текстового поля является действительным int. Более безопасный вариант

int val = 0;
Int32.TryParse( TextBoxD1.Text, out val );

Это предоставит вам некоторые значения по умолчанию, которые вы можете использовать. Int32.TryParseтакже возвращает логическое значение, указывающее, был ли он способен анализировать или нет, так что вы даже можете использовать его как условие ifоператора.

if( Int32.TryParse( TextBoxD1.Text, out val ){
  DoSomething(..);
} else {
  HandleBadInput(..);
}

-1 RE. «Это предоставит вам некоторое значение по умолчанию, которое вы можете использовать». Если вы имеете в виду val, ожидайте неприятностей: «Этот параметр передан неинициализированным; любое значение, изначально предоставленное в результате, будет перезаписано». [Ref. docs.microsoft.com/en-us/dotnet/api/… ]
Zeek2

6
10 лет назад я извиняюсь.
Бабак Наффас

37
int.TryParse()

Он не выдаст, если текст не числовой.


Это лучше, чем два других. Пользовательский ввод может быть неправильного формата. Этот способ более эффективен, чем использование обработки исключений, как того требуют другие.
UncleO

Точно. Возвращает false, если преобразование не удалось.
n8wrl

21
int myInt = int.Parse(TextBoxD1.Text)

Другой способ будет:

bool isConvertible = false;
int myInt = 0;

isConvertible = int.TryParse(TextBoxD1.Text, out myInt);

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


Приведенная выше логическая переменная очень полезна, мы используем преобразованное значение для comaprison, скажем, в условии if. code int NumericJL; bool isNum = int.TryParse (nomeeJobBand, out NumericJL); if (isNum) // Восстановленный JL может быть вставлен в int, а затем продолжить сравнение {if (! (NumericJL> = 6)) {// Nominate} // else {}}
baymax

16

Вам необходимо проанализировать строку, а также убедиться, что она действительно в формате целого числа.

Самый простой способ это:

int parsedInt = 0;
if (int.TryParse(TextBoxD1.Text, out parsedInt))
{
   // Code for if the string was valid
}
else
{
   // Code for if the string was invalid
}

14

Будьте осторожны при использовании Convert.ToInt32 () на символе!
Он вернет UTF-16 код персонажа!

Если вы получите доступ к строке только в определенной позиции с помощью [i]оператора индексации, он вернет a, charа не a string!

String input = "123678";
                    ^
                    |
int indexOfSeven =  4;

int x = Convert.ToInt32(input[indexOfSeven]);             // Returns 55

int x = Convert.ToInt32(input[indexOfSeven].toString());  // Returns 7

11
int x = 0;
int.TryParse(TextBoxD1.Text, out x);

Оператор TryParse возвращает логическое значение, представляющее, успешно ли выполнен анализ. Если это удалось, проанализированное значение сохраняется во втором параметре.

См. Метод Int32.TryParse (String, Int32) для получения более подробной информации.



10

Хотя здесь уже есть много решений, которые описывают int.Parse , во всех ответах чего-то не хватает. Как правило, строковые представления числовых значений различаются в зависимости от культуры. Элементы числовых строк, такие как символы валюты, разделители групп (или тысяч) и десятичные разделители, различаются в зависимости от культуры.

Если вы хотите создать надежный способ разбора строки на целое число, поэтому важно учитывать информацию о культуре. Если вы этого не сделаете, будут использованы текущие настройки культуры . Это может дать пользователю довольно неприятный сюрприз - или даже хуже, если вы анализируете форматы файлов. Если вы просто хотите разобрать английский, лучше просто сделать это явным, указав используемые настройки культуры:

var culture = CultureInfo.GetCulture("en-US");
int result = 0;
if (int.TryParse(myString, NumberStyles.Integer, culture, out result))
{
    // use result...
}

Для получения дополнительной информации читайте о CultureInfo, в частности NumberFormatInfo на MSDN.


8

Вы можете написать свой собственный метод расширения

public static class IntegerExtensions
{
    public static int ParseInt(this string value, int defaultValue = 0)
    {
        int parsedValue;
        if (int.TryParse(value, out parsedValue))
        {
            return parsedValue;
        }

        return defaultValue;
    }

    public static int? ParseNullableInt(this string value)
    {
        if (string.IsNullOrEmpty(value))
        {
            return null;
        }

        return value.ParseInt();
    }
}

И где в коде просто позвоните

int myNumber = someString.ParseInt(); // Returns value or 0
int age = someString.ParseInt(18); // With default value 18
int? userId = someString.ParseNullableInt(); // Returns value or null

В этом конкретном случае

int yourValue = TextBoxD1.Text.ParseInt();

Разве класс не должен вызываться StringExtensionsвместо IntegerExtensions, так как эти методы расширения действуют на a, stringа не на int?
Шива

7

Как объяснено в документации TryParse , TryParse () возвращает логическое значение, которое указывает, что было найдено правильное число:

bool success = Int32.TryParse(TextBoxD1.Text, out val);

if (success)
{
    // Put val in database
}
else
{
    // Handle the case that the string doesn't contain a valid number
}



5
//May be quite some time ago but I just want throw in some line for any one who may still need it

int intValue;
string strValue = "2021";

try
{
    intValue = Convert.ToInt32(strValue);
}
catch
{
    //Default Value if conversion fails OR return specified error
    // Example 
    intValue = 2000;
}

По умолчанию в этом случае не будет хорошей идеей. Если вообще требуется дефолт, я рекомендую вернуть 0.
Пражет Сараванан

5

Вы можете преобразовать строку в int в C #, используя:

Функции класса новообращенного т.е. Convert.ToInt16(), Convert.ToInt32(), Convert.ToInt64()или с помощью Parseи TryParseфункции. Примеры приведены здесь .


Чем это отличается от предыдущих ответов?
Питер Мортенсен

4

Вы также можете использовать метод расширения , чтобы он был более читабельным (хотя все уже привыкли к обычным функциям Parse).

public static class StringExtensions
{
    /// <summary>
    /// Converts a string to int.
    /// </summary>
    /// <param name="value">The string to convert.</param>
    /// <returns>The converted integer.</returns>
    public static int ParseToInt32(this string value)
    {
        return int.Parse(value);
    }

    /// <summary>
    /// Checks whether the value is integer.
    /// </summary>
    /// <param name="value">The string to check.</param>
    /// <param name="result">The out int parameter.</param>
    /// <returns>true if the value is an integer; otherwise, false.</returns>
    public static bool TryParseToInt32(this string value, out int result)
    {
        return int.TryParse(value, out result);
    }
}

И тогда вы можете назвать это так:

  1. Если вы уверены, что ваша строка является целым числом, например, «50».

    int num = TextBoxD1.Text.ParseToInt32();
  2. Если вы не уверены и хотите предотвратить сбои.

    int num;
    if (TextBoxD1.Text.TryParseToInt32(out num))
    {
        //The parse was successful, the num has the parsed value.
    }

Чтобы сделать его более динамичным, чтобы вы могли анализировать его также на удвоение, плавание и т. Д., Вы можете сделать общее расширение.


4

Превращение stringв intможет быть сделано: int, Int32,Int64 и других типов данных , отражающих типов данных целых числа в .NET

Ниже приведен пример этого преобразования:

Этот элемент отображения данных (для информации) инициализирован значением int. То же самое можно сделать прямо, как,

int xxiiqVal = Int32.Parse(strNabcd);

Ex.

string strNii = "";
UsrDataAdapter.SelectCommand.Parameters["@Nii"].Value = Int32.Parse(strNii );

Ссылка, чтобы увидеть эту демонстрацию .



4

Вы можете сделать как ниже без TryParse или встроенных функций:

static int convertToInt(string a)
{
    int x = 0;
    for (int i = 0; i < a.Length; i++)
    {
        int temp = a[i] - '0';
        if (temp != 0)
        {
            x += temp * (int)Math.Pow(10, (a.Length - (i+1)));
        }
    }
    return x;
}

convertToInt («1234») дает 10000 ...... если вы собираетесь скопировать ответ другого человека, хотя бы скопируйте все это
SerenityNow

не сравнивайте меня с самим собой ... вместо этого добавьте обновленное решение .. lol
lazydeveloper

@ SerenityNow вы можете проверить сейчас. Это была опечатка.
Ленивый разработчик

1
ссылаясь на ваш идентификатор, ленивый разработчик не будет создавать такой метод! ; D хорошо
S.Serpooshan


2

Вы можете преобразовать строку в целочисленное значение с помощью метода разбора.

Например:

int val = Int32.parse(stringToBeParsed);
int x = Int32.parse(1234);

Чем это отличается от предыдущих ответов?
Питер Мортенсен

2

То, как я всегда это делаю, выглядит так:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace example_string_to_int
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string a = textBox1.Text;
            // This turns the text in text box 1 into a string
            int b;
            if (!int.TryParse(a, out b))
            {
                MessageBox.Show("This is not a number");
            }
            else
            {
                textBox2.Text = a+" is a number" ;
            }
            // Then this 'if' statement says if the string is not a number, display an error, else now you will have an integer.
        }
    }
}

Вот как бы я это сделал.


0

Если вы ищете длинный путь, просто создайте свой единственный метод:

static int convertToInt(string a)
    {
        int x = 0;

        Char[] charArray = a.ToCharArray();
        int j = charArray.Length;

        for (int i = 0; i < charArray.Length; i++)
        {
            j--;
            int s = (int)Math.Pow(10, j);

            x += ((int)Char.GetNumericValue(charArray[i]) * s);
        }
        return x;
    }

0

МЕТОД 1

int  TheAnswer1 = 0;
bool Success = Int32.TryParse("42", out TheAnswer1);
if (!Success) {
    Console.WriteLine("String not Convertable to an Integer");
}

МЕТОД 2

int TheAnswer2 = 0;
try {
    TheAnswer2 = Int32.Parse("42");
}
catch {
    Console.WriteLine("String not Convertable to an Integer");
}

МЕТОД 3

int TheAnswer3 = 0;
try {
    TheAnswer3 = Int32.Parse("42");
}
catch (FormatException) {
    Console.WriteLine("String not in the correct format for an Integer");
}
catch (ArgumentNullException) {
    Console.WriteLine("String is null");
}
catch (OverflowException) {
    Console.WriteLine("String represents a number less than"
                      + "MinValue or greater than MaxValue");
}



0

Вы можете попробовать следующее. Это будет работать:

int x = Convert.ToInt32(TextBoxD1.Text);

Строковое значение в переменной TextBoxD1.Text будет преобразовано в Int32 и будет сохранено в x.


0

В C # v.7 вы можете использовать встроенный параметр out, без дополнительного объявления переменной:

int.TryParse(TextBoxD1.Text, out int x);

Разве outпараметры не поощряются в C # сейчас?
Питер Мортенсен

-3

Это может помочь вам; D

{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        float Stukprijs;
        float Aantal;
        private void label2_Click(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            MessageBox.Show("In de eersre textbox staat een geldbedrag." + Environment.NewLine + "In de tweede textbox staat een aantal." + Environment.NewLine + "Bereken wat er moetworden betaald." + Environment.NewLine + "Je krijgt 15% korting over het bedrag BOVEN de 100." + Environment.NewLine + "Als de korting meer dan 10 euri is," + Environment.NewLine + "wordt de korting textbox lichtgroen");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            errorProvider1.Clear();
            errorProvider2.Clear();
            if (float.TryParse(textBox1.Text, out Stukprijs))
            {
                if (float.TryParse(textBox2.Text, out Aantal))
                {
                    float Totaal = Stukprijs * Aantal;
                    string Output = Totaal.ToString();
                    textBox3.Text = Output;
                    if (Totaal >= 100)
                    {
                        float korting = Totaal - 100;
                        float korting2 = korting / 100 * 15;
                        string Output2 = korting2.ToString();
                        textBox4.Text = Output2;
                        if (korting2 >= 10)
                        {
                            textBox4.BackColor = Color.LightGreen;
                        }
                        else
                        {
                            textBox4.BackColor = SystemColors.Control;
                        }
                    }
                    else
                    {
                        textBox4.Text = "0";
                        textBox4.BackColor = SystemColors.Control;
                    }
                }
                else
                {
                    errorProvider2.SetError(textBox2, "Aantal plz!");
                }

            }
            else
            {
                errorProvider1.SetError(textBox1, "Bedrag plz!");
                if (float.TryParse(textBox2.Text, out Aantal))
                {

                }
                else
                {
                    errorProvider2.SetError(textBox2, "Aantal plz!");
                }
            }

        }

        private void BTNwissel_Click(object sender, EventArgs e)
        {
            //LL, LU, LR, LD.
            Color c = LL.BackColor;
            LL.BackColor = LU.BackColor;
            LU.BackColor = LR.BackColor;
            LR.BackColor = LD.BackColor;
            LD.BackColor = c;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            MessageBox.Show("zorg dat de kleuren linksom wisselen als je op de knop drukt.");
        }
    }
}

Объяснение будет в порядке.
Питер Мортенсен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.