Як я можу конвертувати String в Int?


638

У мене є, TextBoxD1.Textі я хочу перетворити його в, intщоб зберегти його в базі даних.

Як я можу це зробити?

Відповіді:


1038

Спробуйте це:

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

або ще краще:

int x = 0;

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

Також, оскільки return Int32.TryParsea, 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))
simplesiby

5
Можливо, це неймовірно очевидно для всіх інших, але для нобіїв, що 'out x' робить, це встановити значення x на рядок, який передається як ціле число, якщо кастинг буде успішним. Тобто в цьому випадку x = 0, якщо рядок має будь-які не цілі символи, або x = значення рядка як ціле число в іншому випадку. Отож, акуратне - це один короткий вираз, який підказує, чи успішно виходить кастинг, чи ні, і зберігає одночасно ціле число у змінній. Очевидно, що вам часто хочеться продовжувати вище рядка з 'else {// рядка розбору не є цілим числом, тому деякий код для вирішення цієї ситуації}'
Буде Кроксфорд

@Roberto гаразд, але можливо, що користувач (помилково чи навмисно) введе таке значення "aslkdlksadjsd" всередині текстового поля! так чи повинна наша програма вийти з ладу?
S.Serpooshan

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 РЕ. "Це забезпечить вам деяке значення за замовчуванням, яке ви можете використовувати." Якщо ви маєте на увазі val, очікуйте неприємностей: "Цей параметр передається неініціалізованим; будь-яке значення, спочатку надане в результаті, буде перезаписано." [Відп. docs.microsoft.com/en-us/dotnet/api/… ]
Zeek2

6
10 років тому мені вибачаються.
Бабак Наффас

37
int.TryParse()

Він не кинеться, якщо текст не буде числовим.


Це краще, ніж два інших. Користувач вводить неправильний формат. Цей спосіб є більш ефективним, ніж використання обробки виключень, як вимагають інші.
ДядькоО

Саме так. Він повертає помилковим, якщо конверсія не вдалася.
n8wrl

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

Іншим способом було б:

bool isConvertible = false;
int myInt = 0;

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

Різниця між двома полягає в тому, що перше буде кидати виняток, якщо значення у вашому текстовому полі не вдасться перетворити, тоді як друге просто поверне помилкове.


Наведена вище булева змінна дуже корисна, ми використовуємо перетворене значення для comaprison, скажімо, у пункті if. code int NumericJL; bool isNum = int.TryParse (nomeeJobBand, з 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а не на an 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
}


6

Ви можете використовувати будь-який,

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

або

int i = int.Parse(TextBoxD1.Text);

Чим це відрізняється від попередніх відповідей?
Пітер Мортенсен

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

Вих.

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

@SerenityЗараз ви можете перевірити зараз. Це була помилка друку.
lazydeveloper

1
посилаючись на свій ідентифікатор, ледачий- розробник не створить такого методу! ; D добре
С.Серпоошан


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 ви можете використовувати вбудований параметр без додаткового оголошення змінної:

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.