C# Programming

C# Dizelerinde Sayıları Etkin Bir Şekilde Belirleme

Spread the love

C# geliştirme sürecinde bir dizenin sayıyı temsil edip etmediğini doğrulamak sıkça yapılan bir işlemdir. Bu makale, belirli ihtiyaçlarınız için en iyi yöntemi seçmenize yardımcı olmak üzere çeşitli etkili yaklaşımları, güçlü ve zayıf yönlerini karşılaştırarak ele almaktadır.

İçindekiler Tablosu

Düzenli İfadeler Kullanımı (Regex.IsMatch())

Düzenli ifadeler, dizi kalıplarını doğrulamak için esnek ve güçlü bir çözüm sunar. Regex.IsMatch() metodu, giriş dizinize karşı eşleşecek bir kalıp tanımlamanıza olanak tanır. Bu yaklaşım genellikle verimlidir ve çok çeşitli sayı formatlarını işler.


using System;
using System.Text.RegularExpressions;

public class StringNumberValidator
{
    public static bool IsNumber(string str)
    {
        // Tam sayılar, kayan noktalı sayılar (negatif değerler dahil) için eşleşen desen
        return Regex.IsMatch(str, @"^-?d+(.d+)?$"); 
    }

    public static void Main(string[] args)
    {
        Console.WriteLine(IsNumber("123"));     // True
        Console.WriteLine(IsNumber("123.45"));  // True
        Console.WriteLine(IsNumber("-123"));    // True
        Console.WriteLine(IsNumber("-123.45")); // True
        Console.WriteLine(IsNumber("123a"));    // False
        Console.WriteLine(IsNumber(""));        // False
    }
}

Belirli sayı formatlarını (örneğin, yalnızca tam sayılar, sınırlı sayıda ondalık basamaklı sayılar) karşılamak için düzenli ifadeyi ayarlayabilirsiniz. Bu, onu çeşitli gereksinimlere oldukça uyumlu hale getirir.

TryParse() Metotlarını Kullanma

TryParse() metotları (örneğin, int.TryParse(), double.TryParse(), decimal.TryParse()), dizenin sayısal bir türe ayrıştırılmasını dener. Başarılı olursa true, aksi takdirde false döndürür. Bu, özellikle beklenen sayısal türü bildiğinizde basit ve genellikle verimli bir yaklaşımdır.


using System;

public class StringNumberValidator
{
    public static bool IsInteger(string str)
    {
        int number;
        return int.TryParse(str, out number);
    }

    public static bool IsDouble(string str)
    {
        double number;
        return double.TryParse(str, out number);
    }

    public static void Main(string[] args)
    {
        Console.WriteLine(IsInteger("123"));     // True
        Console.WriteLine(IsDouble("123.45"));  // True
        Console.WriteLine(IsInteger("-123"));    // True
        Console.WriteLine(IsInteger("123a"));    // False
        Console.WriteLine(IsInteger(""));        // False
    }
}

Giriş dizinizin beklenen sayısal türüne bağlı olarak uygun TryParse() metodunu seçin.

LINQ Kullanımı (Enumerable.All())

LINQ’un Enumerable.All() metodu, bir dizenin tüm karakterlerinin belirli bir koşulu karşılayıp karşılamadığını kontrol etmenin özlü bir yolunu sağlar. Ancak, bu yaklaşım ondalık nokta veya negatif işaret içermeyen pozitif tam sayılarla sınırlıdır.


using System;
using System.Linq;

public class StringNumberValidator
{
    public static bool IsPositiveInteger(string str)
    {
        return !string.IsNullOrEmpty(str) && str.All(char.IsDigit);
    }

    public static void Main(string[] args)
    {
        Console.WriteLine(IsPositiveInteger("123"));   // True
        Console.WriteLine(IsPositiveInteger("123.45")); // False
        Console.WriteLine(IsPositiveInteger("-123"));  // False
        Console.WriteLine(IsPositiveInteger(""));      // False
    }
}

Bu metot, sınırlı kapsamı için basit ve verimlidir, ancak diğer yaklaşımların çok yönlülüğünden yoksundur.

Manuel Karakter Karakter Kontrolü (foreach Döngüsü)

Manuel bir yaklaşım en büyük kontrolü sağlar, ancak genellikle daha az verimlidir ve hatalara daha yatkındır. Dizide yineleme yapar, her karakterin rakam, ondalık nokta veya eksi işareti (izin verilirse) olup olmadığını doğru konumda kontrol edersiniz.


using System;

public class StringNumberValidator
{
    public static bool IsNumberManual(string str)
    {
        if (string.IsNullOrEmpty(str)) return false;

        bool hasDecimal = false;
        bool hasSign = false;

        foreach (char c in str)
        {
            if (c == '-' && !hasSign && str.IndexOf(c) == 0)
            {
                hasSign = true;
                continue;
            }
            if (c == '.')
            {
                if (hasDecimal) return false;
                hasDecimal = true;
                continue;
            }
            if (!char.IsDigit(c)) return false;
        }
        return true;
    }

    public static void Main(string[] args)
    {
        Console.WriteLine(IsNumberManual("123"));     // True
        Console.WriteLine(IsNumberManual("123.45"));  // True
        Console.WriteLine(IsNumberManual("-123"));    // True
        Console.WriteLine(IsNumberManual("-123.45")); // True
        Console.WriteLine(IsNumberManual("123a"));    // False
        Console.WriteLine(IsNumberManual(""));        // False
        Console.WriteLine(IsNumberManual("--123"));   //False
        Console.WriteLine(IsNumberManual("12.3.4"));  //False
    }
}

Bu maksimum kontrol sağlarken, çok özel doğrulama gereksinimleri olmadıkça daha önce tartışılan daha özlü ve verimli yöntemleri kullanmanız genellikle önerilir.

Özetle, en uygun yaklaşım ihtiyaçlarınıza bağlıdır. Regex.IsMatch() çoğu senaryo için sağlam ve esnek bir çözüm sunarken, TryParse() basit tam sayı veya kayan noktalı sayı doğrulaması için verimlidir. LINQ ve manuel döngü yaklaşımları, sınırlamaları nedeniyle daha az sıklıkla tercih edilir.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir