Jak przekonwertować ciąg na Int?


Odpowiedzi:


1038

Spróbuj tego:

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

Lub jeszcze lepiej:

int x = 0;

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

Ponadto, ponieważ Int32.TryParsezwraca a bool, możesz użyć jego wartości zwracanej do podjęcia decyzji o wynikach próby parsowania:

int x = 0;

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

Jeśli jesteś ciekawy, różnica między ParseiTryParse najlepiej podsumować w następujący sposób:

Metoda TryParse jest podobna do metody Parse, z tym wyjątkiem, że metoda TryParse nie zgłasza wyjątku, jeśli konwersja się nie powiedzie. Eliminuje to potrzebę korzystania z obsługi wyjątków w celu przetestowania wyjątku formatu w przypadku, gdy s jest nieprawidłowy i nie można go pomyślnie przeanalizować. - MSDN


3
Co jeśli liczba całkowita jest 64-bitowa lub wygląda jak „aslkdlksadjsd”? Czy to nadal jest bezpieczne?
Jonny,

6
@Jonny Int64.Parse(). Jeśli dane wejściowe są inne niż int, otrzymasz wykonanie i ślad stosu za pomocą Int64.Parselub wartość logiczną za Falsepomocą Int64.TryParse(), więc potrzebujesz instrukcji if, takiej jak if (Int32.TryParse(TextBoxD1.Text, out x)) {}.

1
Możesz także spróbować zainicjować zmienną w TryParse, jeśli będzie używana tylko w warunku powodzenia. np Int32.TryParse (TextBoxD1.Text spośród int x))
simplysiby

5
Być może jest to niezwykle oczywiste dla wszystkich innych, ale dla noobijskich ludzi to, co robi „out x”, ustawia wartość x na string-cast-as-integer, jeśli rzutowanie się powiedzie. Tj. W tym przypadku x = 0, jeśli ciąg znaków zawiera dowolne znaki niecałkowite, lub x = w przeciwnym razie wartość string-as-integer. Więc fajne jest to, że jest to jedno krótkie wyrażenie, które mówi, czy rzutowanie się powiodło, czy nie, ORAZ przechowuje liczbę całkowitą rzutowania w zmiennej w tym samym czasie. Oczywiście często chciałbyś kontynuować powyżej linii z „else {// przeanalizowany ciąg nie jest liczbą całkowitą, dlatego jakiś kod do obsługi tej sytuacji}”
Will Croxford

@Roberto ok, ale możliwe jest, że użytkownik (przez pomyłkę lub celowo) wpisze taką wartość „aslkdlksadjsd” w polu tekstowym! więc nasz program powinien ulec awarii?
S.Serpooshan

55
Convert.ToInt32( TextBoxD1.Text );

Użyj tego, jeśli masz pewność, że zawartość pola tekstowego jest poprawna int. Bezpieczniejszą opcją jest

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

Zapewni to pewną wartość domyślną, której możesz użyć. Int32.TryParsezwraca również wartość logiczną wskazującą, czy był w stanie parsować, czy nie, więc można nawet użyć jej jako warunku ifinstrukcji.

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

-1 RE. „Zapewni to pewną domyślną wartość, której możesz użyć”. Jeśli masz na myśli val, spodziewaj się problemu: „Ten parametr jest przekazywany niezainicjowany; każda wartość pierwotnie podana w wyniku zostanie zastąpiona”. [Ref. docs.microsoft.com/en-us/dotnet/api/… ]
Zeek2

6
10 lat temu przepraszam.
Babak Naffas

37
int.TryParse()

Nie rzuca się, jeśli tekst nie jest liczbowy.


To jest lepsze niż pozostałe dwa. Wprowadzane przez użytkownika dane mogą mieć niewłaściwy format. Ten jest bardziej wydajny niż używanie obsługi wyjątków, tak jak wymagają tego inne.
Wujek

Dokładnie. Zwraca false, jeśli konwersja nie powiodła się.
n8wrl

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

Innym sposobem byłoby:

bool isConvertible = false;
int myInt = 0;

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

Różnica między nimi polega na tym, że pierwszy zwróci wyjątek, jeśli wartość w polu tekstowym nie może zostać przekonwertowana, a drugi zwróci po prostu fałsz.


Powyższa zmienna boolowska jest bardzo przydatna, używamy przekonwertowanej wartości dla comaprison, powiedzmy w klauzuli if. code int NumericJL; bool isNum = int.TryParse (nomeeJobBand, out NumericJL); if (isNum) // Zachowane JL jest w stanie przekazać do int, a następnie przejść do porównania {if (! (NumericJL> = 6)) {//
Nominate

16

Musisz przeanalizować ciąg, a także upewnić się, że jest naprawdę w formacie liczby całkowitej.

Najłatwiej jest to zrobić:

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

Zachowaj ostrożność podczas używania Convert.ToInt32 () na char!
Zwróci UTF-16 kod znaku!

Jeśli uzyskasz dostęp do ciągu tylko w określonej pozycji za pomocą [i]operatora indeksowania, zwróci a, chara nie 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);

Instrukcja TryParse zwraca wartość logiczną wskazującą, czy parsowanie się powiodło, czy nie. Jeśli się powiedzie, przeanalizowana wartość zostanie zapisana w drugim parametrze.

Zobacz Int32.TryParse Method (String, Int32), aby uzyskać bardziej szczegółowe informacje.



10

Chociaż istnieje już wiele rozwiązań, które opisują int.Parse , we wszystkich odpowiedziach brakuje czegoś ważnego. Zazwyczaj reprezentacje ciągów wartości liczbowych różnią się w zależności od kultury. Elementy ciągów liczbowych, takie jak symbole walut, separatory grup (lub tysięcy) i separatory dziesiętne, różnią się w zależności od kultury.

Jeśli chcesz stworzyć solidny sposób na parsowanie łańcucha na liczbę całkowitą, ważne jest, aby wziąć pod uwagę informacje o kulturze. Jeśli tego nie zrobisz, zostaną użyte bieżące ustawienia kultury . To może sprawić użytkownikowi dość nieprzyjemną niespodziankę - lub nawet gorzej, jeśli analizujesz formaty plików. Jeśli chcesz po prostu parsować po angielsku, najlepiej po prostu wyraź to, określając ustawienia kultury, które mają być używane:

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

Aby uzyskać więcej informacji, przeczytaj o CultureInfo, w szczególności NumberFormatInfo w MSDN.


8

Możesz napisać własną metodę rozszerzenia

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

I gdziekolwiek w kodzie po prostu zadzwoń

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

W tym konkretnym przypadku

int yourValue = TextBoxD1.Text.ParseInt();

Nie należy wywoływać klasy StringExtensionszamiast IntegerExtensions, ponieważ te metody rozszerzenia działają na a, stringa nie na int?
Shiva

7

Jak wyjaśniono w dokumentacji TryParse , funkcja TryParse () zwraca wartość logiczną, która wskazuje, że znaleziono prawidłową liczbę:

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

Możesz użyć albo

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

lub

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

Czym różni się to od poprzednich odpowiedzi?
Peter Mortensen

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

Domyślne ustawienie w tym przypadku nie byłoby dobrym pomysłem. Jeśli w ogóle konieczne jest
wywiązanie się ze

5

Możesz przekonwertować ciąg na int w C #, używając:

Funkcje klasy konwersji czyli Convert.ToInt16(), Convert.ToInt32(), Convert.ToInt64()lub przy użyciu Parsei TryParsefunkcje. Przykłady podano tutaj .


Czym różni się to od poprzednich odpowiedzi?
Peter Mortensen

4

Możesz także użyć metody rozszerzenia , więc będzie ona bardziej czytelna (chociaż wszyscy są już przyzwyczajeni do zwykłych funkcji 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);
    }
}

A potem możesz to tak nazwać:

  1. Jeśli masz pewność, że Twój ciąg jest liczbą całkowitą, na przykład „50”.

    int num = TextBoxD1.Text.ParseToInt32();
  2. Jeśli nie masz pewności i chcesz zapobiec awariom.

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

Aby uczynić go bardziej dynamicznym, aby można go było parsować także do double, float itp., Możesz zrobić ogólne rozszerzenie.


4

Konwersja stringdo intmożna zrobić dla: int, Int32,Int64 oraz inne typy danych odzwierciedlających typy danych całkowitych w .NET

Poniższy przykład pokazuje tę konwersję:

Ten element (dla informacji) adaptera danych został zainicjowany na wartość int. To samo można zrobić bezpośrednio tak, jak

int xxiiqVal = Int32.Parse(strNabcd);

Dawny.

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

Link, aby zobaczyć to demo .



4

Możesz zrobić jak poniżej bez TryParse lub wbudowanych funkcji:

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”) daje 10000 ...... jeśli masz zamiar skopiować odpowiedź innej osoby, przynajmniej skopiuj całość
SerenityNow

nie porównuj mnie ze sobą .. zamiast tego dodaj zaktualizowane rozwiązanie .. lol
lazydeveloper 11.04.18

@SerenityNow możesz teraz sprawdzić. To był błąd literówki.
lazydeveloper

1
odnosząc się do twojego identyfikatora, leniwy programista nie stworzy takiej metody! ; D dobry
S.Serpooshan


2

Za pomocą metody parsowania możesz przekonwertować ciąg znaków na wartość całkowitą.

Na przykład:

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

Czym różni się to od poprzednich odpowiedzi?
Peter Mortensen

2

Zawsze tak to robię:

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

Tak bym to zrobił.


0

Jeśli szukasz długiej drogi, po prostu stwórz jedną metodę:

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

METODA 1

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

METODA 2

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

METODA 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

Ten kod działa dla mnie w Visual Studio 2010:

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

Tak, ale czym różni się od poprzednich odpowiedzi?
Peter Mortensen

0

To działa dla mnie:

using System;

namespace numberConvert
{
    class Program
    {
        static void Main(string[] args)
        {
            string numberAsString = "8";
            int numberAsInt = int.Parse(numberAsString);
        }
    }
}

Wytłumaczenie byłoby w porządku.
Peter Mortensen

0

Możesz wypróbować następujące. To będzie działać:

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

Wartość ciągu w zmiennej TextBoxD1.Text zostanie przekonwertowana na Int32 i będzie przechowywana w x.


0

W C # v.7 można użyć wbudowanego parametru out, bez dodatkowej deklaracji zmiennej:

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

Czy outw C # nie są teraz zniechęcane parametry?
Peter Mortensen

-3

To może ci pomóc; 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.");
        }
    }
}

Wytłumaczenie byłoby w porządku.
Peter Mortensen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.