2009-10-02 10 views
5

Po prostu ciekawi mnie, dlaczego zespół języka C# nie dostarczył funkcji IsNumeric w obiekcie String. Funkcja IsNumeric byłaby bardziej odpowiednia dla obiektu String niż funkcja Int32.TryParse.Dlaczego nie ma funkcji String.IsNumeric w języku C#

Uwaga: Zadaję to pytanie, ponieważ trudno mi było wyjaśnić to początkującemu i nie podoba mi się przekleństwo C# za to!

Aktualizacja: Proszę, to pytanie nie dotyczy implementacji funkcji IsNumeric.

+4

Możesz dodać jako metodę rozszerzenia. :) –

+0

Jestem świadomy metody rozszerzenia, ale to nie jest pytanie tutaj, ale dzięki anyways (-: – pradeeptp

Odpowiedz

17

Problem z taką metodą może decydować o tym, co jest liczone jako "numeryczne". Czy powinien zezwalać na punkty dziesiętne, czy powinien zezwalać na wprowadzanie białych znaków, czy powinien mieć górną granicę dla liczby cyfr?

Int32.TryParse odpowiada na znacznie bardziej precyzyjne pytanie: "czy jest to poprawna reprezentacja ciągów znaków Int32?"

Oczywiście nic nie powstrzymuje pisania własnej metody rozszerzenia, która decyduje o tym, czy ciąg znaków jest numeryczny zgodnie z własnymi regułami.

+0

To nie zatrzymało MS umieszczając te metody na typ danych Char. –

+5

Dzieje się tak dlatego, że pojedynczy znak jest albo znakiem liczbowym, czy nie, więc taka metoda ma sens – RobV

4

Ponieważ może być mnóstwo funkcji, które można znaleźć przydatne i absolutnie potrzebne.

IsNumeric() 
IsAlpha() 
IsAlphaNumeric() 
IsEmailAddress() 
IsGuid() 
... 

I tak dalej. Każda osoba może z łatwością dodać jeszcze kilkanaście metod, które uzna za absolutnie potrzebne. Ramy mają pozostać ogólne i dostarczać podstawowych narzędzi do wykonania pracy, a może i do tworzenia dodatkowych narzędzi w razie potrzeby.

Powiedziawszy to, po prostu dodaj swoje metody rozszerzenia.

+0

Czuję, że funkcja IsNumeric jest czymś, co dorastaliśmy przy użyciu w innych językach.I czuję, że było to absolutnie potrzebne, chyba że chcesz mnie do eksperta, który ma głęboką wiedzę na temat alternatywnych funkcji w innych obiektach! – pradeeptp

3

Musi być gdzieś linia pomiędzy metodami, które umieściłeś w klasie, a operacjami, które są lepiej wykonywane przez inne klasy.

Jeśli istnieje metoda IsNumeric, inne osoby mogą wymagać metod IsValidPhoneNumber, IsValidEmailAddress, IsValidURI lub nawet IsValidZipCodeInNewZealand ... wszystkie te mogą być lepiej zaimplementowane we własnej domenie.

+0

@Timbo Jeśli przejdziesz przez liczbę pytań dotyczących funkcji IsNumeric w innym miejscu w Internecie, zrozumiesz, dlaczego zadałem to pytanie. Jest to jedna wspólna funkcja, którą większość programistów chciałaby zobaczyć w obiekcie String. Dla tych, którzy pochodzą z innych języków/narzędzi, takich jak VB6, oczekiwalibyśmy, że będzie dostępny w obiekcie String! – pradeeptp

1

IIRC tam jest Char.IsDigit (char c);

Dlatego myślę, że powinno działać:

string _temp = "12341234"; 
bool _isNumeric = _temp.ToCharArray().All(x => Char.IsDigit(x)); 

I można zawinąć że jako metod rozszerzenie, jeśli chcesz.

+0

Niestety, nie działa to w przypadku liczb ujemnych lub bardziej wyszukanego formatu liczb w zależności od ustawień lokalizacji bieżącego użytkownika. – Timbo

+0

Jeśli zezwalasz tylko na liczby naturalne bez poprzedzającego lub kończącego się miejsca, twoja ekspresja ma sens. Wszystko zależy od tego, co zdefiniujesz jako "numeryczne". –

0

Na marginesie: Zawsze można zaimplementować własną:

public static class StringExtensions 
{ 
    public static Boolean IsNumeric(this String s) 
    { 
     // your own definition goes here 
    } 
} 
3

myślę logika Int32.TryParse jest, że klasa Int32 wie, co jest ważne całkowita 32-bitowa natomiast klasa String nie ma pojęcie o tym, czym jest liczba.

Zasada jest taka, że ​​obiekt może najlepiej sprawdzić, czy coś może być traktowane jako/skonwertowane do tego konkretnego obiektu.

Powiązane problemy