DateTime öğesinden false döndürmek yerine DateTime olarak tanınan ondalık değerler.


9

Ben bir tarih veya ondalık olup olmadığını dize değerine dayalı bir denetim gerçekleştirmek gerekir ama tarih ayrıştırma her zaman ondalık için doğru döner.

string val = "3.5";
DateTime oDate = DateTime.Parse(val);

Geçerli bir tarih döndürür 3/5/2019.

Tarih formatının bilinmediği geçerli bir tarih olduğunu bilmek için dizeyi nasıl doğrularım?


6
Önce ondalık olup olmadığını kontrol et? Veya DateTime.ParseExacthangi formatları alabileceğini / alması gerektiğini biliyorsanız kullanın
A Friend

3
TryParseExactGeçerli tarih biçimlerini kullanabilir ve belirleyebilirsiniz.
juharr

5
Gerçekten de - DateTime.Parsebirden çok desen dener. Yalnızca belirli olanları tanımak istiyorsanız, bunları özel olarak ayrıştırmayı deneyin.
Jon Skeet

Yanıtlar:


3

"Geçerli bir tarih bilmek için dize nasıl doğrulanır?"

Sorun olduğunu "3.5" edilmektedir geçerli bir tarih (ve aynı zamanda bir ondalık) düşündü.

Ondalık türün her zaman "kazanmasını" istiyorsanız (yani istemiyorsanız isDateve isDecimalher ikisinde birden bulunmuyorsanız true), doğrulamanıza bir ondalık işareti ekleyin.

Bunu yapmanın bir yolu , dizenin bir türe dönüştürülüp dönüştürülemeyeceğini belirlemek için TryParseyöntemleri ( boolbir dize türe ayrıştırılabilirse döndüren ve bir outparametreyi dönüştürülen değere ayarlar ) kullanmaktır:

string val = "3.5";

// temp variables to hold parsed values
DateTime tmpDate;
decimal tmpDec;
int tmpInt;

var isDecimal = decimal.TryParse(val, out tmpDec);
var isInteger = int.TryParse(val, out tmpInt);

// When checking if it's a DateTime, make sure it's not also a decimal
var isDate = !isDecimal && DateTime.TryParse(val, out tmpDate);

Zaten denemiştim ama 3.5 geçerli bir tarih ve geçerli bir ondalık sayı, bu yüzden hiç yardımcı olmuyor.
Munawar

1
Yukarıdaki kodda, isDatebir falseo bir çek içerdiğinden isDecimal. İstediğiniz bu değil miydi?
Rufus L

2
@Munawar - "3.5 geçerli bir tarih ve geçerli bir ondalık sayıdır". Eğer insanlar olarak, bu dizeyle sunulur ve başka bir bağlam yoksa, bunun bir tarih mi, ondalık mı yoksa başka bir şey mi amaçlandığını bilmiyoruz . Bir bilgisayarın sihirli bir şekilde yanıt almasını bekleyemezsiniz.
Damien_The_Unbeliever

Evet, bu yanıt soruna özeldir ve biçimler biliniyorsa ParseExact en iyi şekilde uysa da sorunumu çözer.
Munawar

Tarih biçimi "12122019" olduğunda stiliniz var
Athanasios Kataras

6

Kontrol ParseExact resmi belgelere

Temsili tam olarak biliyorsanız, böyle bir şey yapabilirsiniz:

  format = "ddd dd MMM yyyy h:mm tt zzz";
  try {
     result = DateTime.ParseExact(dateString, format, provider);
     Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
  }
  catch (FormatException) {
     Console.WriteLine("{0} is not in the correct format.", dateString);
  }

Eğer bilmiyorsanız, kültürel konveksiyonlarla sıkışıp kaldınız

Belirli bir kültürün kurallarını kullanarak bir tarih ve saat dizesini ayrıştırın. Ayrıştırma (Dize, IFormatProvider) aşırı yüklemesi (bkz. Ayrıştırma ve Kültürel Sözleşmeler)


Biçim, kullanıcı tercihlerine göre herhangi biri olabileceği bilinmemektedir.
Munawar

1
@Munawar bu durumda 1/3/2019 ve 3/1/2019 arasında nasıl ayrım yapacaksınız?
Blaise

@Athanasios, uygulama farklı bölgeler ve tarihler için şifreli olarak saklanır. çünkü kullanıcı tarih biçimlerini değiştirebilir, bu nedenle biçim biliniyorsa ParseExact en uygun olmasına rağmen belirli biçimleri uygulamakla uğraşmak istemez.
Munawar
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.