String'i Int'ye nasıl dönüştürebilirim?


Yanıtlar:


1038

Bunu dene:

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

veya daha iyisi:

int x = 0;

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

Ayrıca, Int32.TryParseiadeleri boolnedeniyle, ayrıştırma girişiminin sonuçları hakkında karar vermek için dönüş değerini kullanabilirsiniz:

int x = 0;

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

Merak ediyorsanız Parseve arasındaki fark TryParseen iyi şekilde şöyle özetlenir:

Dönüşüm başarısız olursa, TryParse yöntemi bir istisna atmaz dışında TryParse yöntemi Parse yöntemi gibidir. S'nin geçersiz olması ve başarıyla ayrıştırılamaması durumunda FormatException'ı sınamak için özel durum işleme gereksinimini ortadan kaldırır. - MSDN


3
Ya tam sayı 64 bitse veya "aslkdlksadjsd" gibi görünüyorsa? Bu hala güvenli mi?
Jonny

6
@Jonny Int64.Parse(). Girdi int değilse, o zaman bir yürütme ve bir yığın izleme Int64.Parseveya boole Falseile Int64.TryParse()alacaksınız, bu nedenle gibi bir if deyimine ihtiyacınız olacaktır if (Int32.TryParse(TextBoxD1.Text, out x)) {}.

1
Yalnızca başarı koşulunda kullanılacaksa değişkeni TryParse içinde başlatmayı deneyebilirsiniz. örneğin: Int32.TryParse) (TextBoxD1.Text, int x dışarı)
simplysiby

5
Belki bu herkes için inanılmaz derecede açıktır, ancak noobish insanlar için 'out x' in yaptığı şey, eğer döküm başarılı olursa x'in değerini string-cast-as-integer olarak ayarlamaktır. Yani bu durumda dizede tamsayı olmayan karakterler varsa x = 0 veya aksi takdirde x = tamsayı olarak dize değeri bulunur. Yani temiz olan şey, dökümün başarılı olup olmadığını söyleyen kısa bir ifadedir ve döküm tamsayısını bir değişkende aynı anda depolar. Açıkçası 'else {// string parsed bir tamsayı değildir, bu nedenle bu durumu ele almak için bazı kodlar' ile çizginin üzerinde devam etmek istersiniz} '
Will Croxford

@Roberto ok, ancak kullanıcının (yanlışlıkla veya kasıtlı olarak) bir metin kutusuna "aslkdlksadjsd" değeri yazması mümkündür! programımız çökmeli mi?
S.Serpooshan

55
Convert.ToInt32( TextBoxD1.Text );

Metin kutusunun içeriğinin geçerli olduğundan eminseniz bunu kullanın int. Daha güvenli bir seçenek

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

Bu, kullanabileceğiniz bazı varsayılan değerler sağlayacaktır. Int32.TryParseayrıştırılıp ayrıştırılamadığını belirten bir Boolean değeri döndürür, böylece bunu bir ifdeyimin koşulu olarak da kullanabilirsiniz .

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

-1 RE. "Bu, kullanabileceğiniz bazı varsayılan değerler sağlayacaktır." Val demek istiyorsanız, sorun bekliyoruz: "Bu parametre başlatılmamış olarak iletilir; sonuçta başlangıçta sağlanan değerlerin üzerine yazılır." [Ref. docs.microsoft.com/en-us/dotnet/api/… ]
Zeek2

6
10 yıl önce özür dilerim.
Babak Naffas

37
int.TryParse()

Metin sayısal değilse atmaz.


Bu diğer ikisinden daha iyi. Kullanıcı girişi büyük olasılıkla yanlış biçim olabilir. Bu, diğerlerinin gerektirdiği gibi istisna işlemeyi kullanmaktan daha etkilidir.
Amca

Kesinlikle. Dönüştürme başarısız olursa false değerini döndürür.
n8wrl

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

Başka bir yol:

bool isConvertible = false;
int myInt = 0;

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

İkisi arasındaki fark, metin kutunuzdaki değer dönüştürülemezse birincisinin bir istisna atması, ikincisinin ise yanlış döndürmesi.


Yukarıdaki boole değişkeni, comaprison için dönüştürülmüş değeri kullandığımızda çok yararlıdır, bir if deyiminde diyelim. code int NumericJL; bool isNum = int.TryParse (nomeeJobBand, dışarı NumericJL); if (isNum) // Geri alınan JL, int'e geçebilir ve karşılaştırma için devam edebilir {if (! (NumericJL> = 6)) {//
Nominate

16

Dizeyi ayrıştırmanız gerekir ve dizenin gerçekten bir tamsayı biçiminde olduğundan emin olmanız gerekir.

En kolay yol şudur:

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

Bir karakter üzerinde Convert.ToInt32 () kullanırken dikkatli olun! Karakterin UTF-16 kodunu
döndürür !

[i]Dizeye dizin oluşturma operatörünü kullanarak yalnızca belirli bir konumda erişirseniz, a chardeğil döndürür 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 deyimi, ayrıştırmanın başarılı olup olmadığını gösteren bir boole döndürür. Başarılı olursa, ayrıştırılan değer ikinci parametreye kaydedilir.

Daha ayrıntılı bilgi için bkz. Int32.TryParse Yöntemi (String, Int32) .



10

Burada zaten tarif edilen birçok çözüm olsa da, int.Parsetüm cevaplarda eksik olan önemli bir şey var. Tipik olarak, sayısal değerlerin dize gösterimleri kültüre göre değişir. Para birimi simgeleri, grup (veya binlerce) ayırıcı ve ondalık ayırıcı gibi sayısal dizelerin öğelerinin tümü kültüre göre değişir.

Bir dizeyi bir tam sayıya ayrıştırmak için sağlam bir yol oluşturmak istiyorsanız, kültür bilgisini dikkate almak önemlidir. Bunu yapmazsanız, geçerli kültür ayarları kullanılır. Bu, dosya formatlarını ayrıştırıyorsanız kullanıcıya oldukça kötü bir sürpriz verebilir - hatta daha da kötüsü. Yalnızca İngilizce ayrıştırmayı istiyorsanız, kullanılacak kültür ayarlarını belirterek açıkça belirtmeniz en iyisidir:

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

Daha fazla bilgi için CultureInfo, özellikle MSDN'de NumberFormatInfo hakkında bilgi edinin .


8

Kendi uzantı yönteminizi yazabilirsiniz

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

Ve kodun neresinde olursa olsun

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

Bu somut durumda

int yourValue = TextBoxD1.Text.ParseInt();

Bu genişletme yöntemleri a üzerinde değil de üzerinde hareket ettiğinden sınıf StringExtensionsyerine çağrılmamalı mı? IntegerExtensionsstringint
Shiva

7

TryParse belgelerinde açıklandığı gibi , TryParse () geçerli bir sayının bulunduğunu gösteren bir Boolean döndürür:

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

İkisini de kullanabilirsiniz,

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

veya

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

Bu önceki cevaplardan nasıl farklı?
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;
}

Bu durumda temerrüt etmek iyi bir fikir olmaz. Eğer herhangi bir temerrüde
düşülmesi çok önemliyse,

5

Bir dizeyi C # ile int'e dönüştürebilirsiniz:

Yani dönüştürme sınıfının İşlevleri Convert.ToInt16(), Convert.ToInt32(), Convert.ToInt64()veya kullanarak Parseve TryParseİşlevleri. Örnekler burada verilmiştir .


Bu önceki cevaplardan nasıl farklı?
Peter Mortensen

4

Bir uzantı yöntemi de kullanabilirsiniz , bu nedenle daha okunabilir olacaktır (herkes normal Ayrıştırma işlevlerine zaten alışmış olsa da).

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

Ve sonra bu şekilde diyebilirsiniz:

  1. Dizenizin "50" gibi bir tamsayı olduğundan eminseniz.

    int num = TextBoxD1.Text.ParseToInt32();
  2. Emin değilseniz ve çökmeleri önlemek istiyorsanız.

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

Daha dinamik hale getirmek için, iki katına çıkarmak, yüzmek vb. İçin ayrıştırabilirsiniz, genel bir uzantı yapabilirsiniz.


4

Dönüştürülmesi stringiçin int: için de yapılabilir int, Int32, Int64ve diğer veri tipleri .NET içinde tamsayı veri türlerini yansıtan

Aşağıdaki örnekte bu dönüşüm gösterilmektedir:

Bu değer (bilgi için) int değerine başlatılan veri bağdaştırıcısı öğesi. Aynısı doğrudan gibi yapılabilir,

int xxiiqVal = Int32.Parse(strNabcd);

Ör.

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

Bu demosu izleme bağlantısı .



4

TryParse veya dahili işlevler olmadan aşağıdakileri yapabilirsiniz:

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 verir ...... başka birinin cevabını kopyalayacaksanız, en azından her şeyi kopyalayın
SerenityNow

beni kendinizle karşılaştırmayın .. bunun yerine güncellenmiş çözüm ekleyin .. lol
lazydeveloper

@SerenityŞimdi kontrol edebilirsiniz. Yazım hatasıydı.
lazydeveloper

1
kimliğinize atıfta bulunarak, tembel bir geliştirici böyle bir yöntem oluşturmaz! ; D good
S.Serpooshan


2

Ayrıştırma yöntemi yardımıyla dizeyi bir tamsayı değerine dönüştürebilirsiniz.

Örneğin:

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

Bu önceki cevaplardan nasıl farklı?
Peter Mortensen

2

Ben her zaman böyle yapmak gibi:

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

Ben böyle yapardım.


0

Uzun bir yol arıyorsanız, sadece bir yönteminizi oluşturun:

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

YÖNTEM 1

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

YÖNTEM 2

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

YÖNTEM 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

Bu kod Visual Studio 2010'da benim için çalışıyor:

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

Evet, ama önceki cevaplardan farkı nedir?
Peter Mortensen

0

Bu benim için çalışıyor:

using System;

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

Bir açıklama yapılabilir.
Peter Mortensen

0

Aşağıdakileri deneyebilirsiniz. Çalışacak:

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

TextBoxD1.Text değişkenindeki dize değeri Int32'ye dönüştürülecek ve x içinde saklanacaktır.


0

C # v.7'de ek değişken bildirimi olmadan bir satır içi çıkış parametresi kullanabilirsiniz:

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

Değil misin outşimdi C # cesaretini parametrelerinin?
Peter Mortensen

-3

Bu size yardımcı olabilir; 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.");
        }
    }
}

Bir açıklama yapılabilir.
Peter Mortensen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.