Boolean.TryParse nepracuje spravne   otázka

VB.NET, .NET

        Dim i As String
        Dim o As Boolean

        i = TextBox1.Text

        If Boolean.TryParse(i, o) = True Then
            Me.Text = "OK"
        Else
            Me.Text = "BAD"
        End If

Ak dam to textboxu napr cislo 0 alebo ine, aj tak sa Boolean.TryParse nevyhodnoti ako True. Vzdy na False, a pritom nieje problem pretypovat Integer na Boolean.

Neviete kde robim chybu?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No, konkrétně nula se na True vyhodnotit nemůže, ostatní čísla také nemají důvod. Funkce Boolean.TryParse očekává jen hodnoty True a False, nic jiného nebere. To není chyba, takhle je funkce definována a tak se má chovat. Je to stejné, jako kdybyste chtěl po funkci Integer.TryParse, aby četla i hodnoty True nebo False, přestože to nejsou čísla.

Ono v .NETu obecně spolu typy číselné a Boolean moc nekamarádí, nemůžete napsat If 5 Then něco, resp. ve VB asi můžete, protože ten převede kde co, ale v C# by tohle jít nemělo.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Obecně je False definováno jako 0 a True jako cokoliv různého od nuly, proto například CType(666, Boolean) se vyhodnotí jako True. To jen debilní TryParse a podobné metody (Parse, Convert.ToBoolean apod.) z naprosto nepochopitelného důvodu akceptují pouze Boolean.TrueString nebo Boolean.FalseString...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To sice ano, ale pořád nechápu, proč by funkce, která má za úkol parsovat hodnotu Boolean, tedy True či False, měla umět ještě parsovat datové typy Integer, Double a jim podobné. K tomu není určená.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ona má za úkol pokusit se vytvořit typ Boolean ze zadaných dat, stejně jako DateTime.TryParse také nebere jeden konkrétní formát data.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Souhlasím, DateTime.TryParse také bere mnoho různých formátů, ale je to pořád datum. Číslo není jiným formátem typu Boolean, i když se na něj dá převádět celkem intuitivně.

Je to samozřejmě detail, tady to stejně nevyřešíme. Bylo by hezké, kdyby to Boolean.TryParse uměla a bylo by to i logické. Ale bohužel to tak není.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nebo ještě lepší příklad: Enum. Je to číselný typ (bez explicitního uvedení typu Integer) a přesto jeho TryParse akceptuje jak číselnou, tak i textovou (název položky) reprezentaci.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Kdybyste se nejdříve podíval do MSDN na dokumentaci k metodě Boolean.TryParse, našel byste tam odpověď.

Jediná možnost jak to vyřešit je ošetřit vyjímku InvalidCastException:

Try
  Dim b = Convert.ToBoolean(TextBox1.Text)
Catch ex As InvalidCastException
  'Hodnotu nelze převést na Boolean
End Try

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No, ono by mělo stačit tohle, odchycení výjimky je zbytečně pomalé:

Public Function Parse(txt As String) As Bolean
    Dim d As Double, b As Boolean
    If Not Double.TryParse(txt, d) Then
        If Not Boolean.TryParse(txt, b) Then            
            Throw New FormatException()
        Else
            Return b
        Else
    Else
        Return d <> 0
    End If    
End Function
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak toto jsem jaksi nepobral. Jednak vyhazujete vyjímku přestože tvrdíte že je to pomalé a jednak jsme se přece shodli na tom, že Boolean nelze parsovat z číselných hodnot (tím spíše z desetinných čísel které lze zadat), takže tahle zrůdnost přece nemůže nikdy fungovat.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Výjimku vyhazuji jen v případě, že daný text není ani text True/False, ani číslo, které by se na Boolean dalo převést.

Jinak to prostě zkusím naparsovat nejdřív jako číslo přes Double.TryParse, a pokud to jde, tak to převedu na Boolean. Pokud to nejde, zkusím to naparsovat přes Boolean.TryParse, a pokud se ani to nepovede, vyhodím výjimku.

Protože používám TryParse, tak mi to vrací True nebo False podle toho, jestli se naparsování podařilo a pokud se to povedlo, hodnotu to naparsuje do druhého parametru, který se předává referencí. Nevidím důvod, proč by to byla zrůdnost a proč by to nemělo fungovat.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback