NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Jaroslav Trojan
Tvůrce
Avatar
Jaroslav Trojan:12.8.2016 11:32

Jsem začátečník a nedaří se mi převod Stringu na typ Single:
Zkoušel jsem 2 způsoby
Dim T As String=CStr(sr­.ReadLine() ) .....to funguje, čte se ze souboru na disku

  1. t1=Convert.To­Single(T)
  2. t1=CType(T,Single)

ani jeden způsob nejde. Proměnné t1 je Single , T je String
kde je chyba? hlásí, že řetězec nemá správný tvar

Odpovědět
12.8.2016 11:32
statik
Avatar
Honza
Člen
Avatar
Odpovídá na Jaroslav Trojan
Honza:12.8.2016 12:01

Za předpokladu že v tom stringu je opravdu číslo které lze přetypovat na Single, tak by ti ta verze s CType měla fungovat. Následující kód mi funguje bez problémů a jediný rozdíl oproti tvé verzi je ten, že jsem deklaroval t1. Pokud máš Visual Studio nastaveno aby ti samo určovalo datový typ podle hodnoty proměnné, tak důrazně doporučuju to vypnout.

Dim T As String = "123"
Dim t1 As Single = CType(T, Single)

Console.WriteLine("Hodnota je: {0}", t1)

Nicméně zásadní problém je v tom, že pokud se přetypování nepovede, aplikace spadne.
Jistější je použít TryParse, kde v návratové hodnotě této funkce je informace, zda se přetypování povedlo (true) nebo nepovedlo (false). Navíc pokud se přetypování nepovede, tak aplikace nespadne, ale jen se neuloží do proměnné t1 nová hodnota (v tomto případě tam zůstane defaultní hodnota, což je u Single 0):

Dim T As String = "123"
Dim t1 As Single


If Single.TryParse(T, t1) = True Then
    ' přetypování se povedlo
    Console.WriteLine("Přetypování OK, hodnota je: {0}", t1)
Else
    ' přetypování se nepovedlo
    Console.WriteLine("Přetypování se nepovedlo")
End If
Editováno 12.8.2016 12:03
Nahoru Odpovědět
12.8.2016 12:01
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Jaroslav Trojan
Tvůrce
Avatar
Odpovídá na Honza
Jaroslav Trojan:12.8.2016 12:15

Načítám tento soubor z disku:

 10            0
 594.644
 454.6439      2
 154.6439
 14.64392      4
-385.3561
-394.6894      4.133333
-394.6894
-404.0227      4.266667
-404.0227
-413.356       4.4
-413.356
-422.6894      4.533333
-422.6894
-424.0893      4.553333
-424.0893
-425.4893      4.573333
-425.4893
-426.8893      4.593333
-426.8893
-428.2893      4.613333
-428.2893
-525.3561
 323.9388
 203.9388      2
 3.938782
-176.0612      5
-476.0612
-477.2613      5.02
-477.2613
-478.4613      5.04
-478.4613
-479.6613      5.06
-479.6613
-480.8613      5.08
-480.8613
-482.0613      5.1
-482.0613
-483.2613      5.12
-483.2613
-484.4613      5.14
-484.4613
-485.6613      5.16
-485.6613
-536.0613
 606.7308
 366.7308      3
-33.26923
-193.2692      5
-493.2693
-494.8693      5.02
-494.8693
-496.4693      5.04
-496.4693
-498.0693      5.06
-498.0693
-499.6693      5.08
-499.6693
-501.2693      5.1
-501.2693
-502.8693      5.12
-502.8693
-504.4693      5.14
-504.4693
-506.0693      5.16
-506.0693
-573.2693

první 2 čísla přečtu lehce, ale real číslo dělá problém, jak ho tedy přečíst.

Nahoru Odpovědět
12.8.2016 12:15
statik
Avatar
Dušan Neckař:12.8.2016 12:58

Nejjednodušší způsob mi přijde: 1. převést do stringu ; 2. Pomocí funkce string.Replace(), vyměnit '.' za ',' ; 3. Convert.ToSin­gle(tvojeProme­na):

String neco = "12.5 ";
neco = neco.Replace(".",",");
float cislo = float.Parse(neco);
Single singl = 0;
singl = Convert.ToSingle(cislo);
Editováno 12.8.2016 13:00
 
Nahoru Odpovědět
12.8.2016 12:58
Avatar
Honza
Člen
Avatar
Odpovídá na Dušan Neckař
Honza:12.8.2016 13:26

To bych silně nedoporučoval. Pokud to pustíš na počítači kde bude nastaveno jiné jazykové prostředí s jiným oddělovačem desetinných míst, zas to nebude fungovat. Navíc jsem to zkoušel a problém není v oddělovači (to jde nastavit pomocí InvariantCulture) ale z nějakého mně neznámého důvodu má problém se zápornýma číslama. Kladná to přetypuje bez problémů. Navíc ten kdo má na svědomí ten datový soubor by zasloužil za uší, jako oddělovač sloupců použít sekvenci 6 až 12 mezer je něco :D

Nahoru Odpovědět
12.8.2016 13:26
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Roman
Člen
Avatar
Odpovídá na Jaroslav Trojan
Roman:13.8.2016 8:04

Je to snadne. Mezery nahrad znakem pak splitni a hotovo. Zmenou Culture reknes, aby bral jako oddelovat v cisle tecku. Dale pomoci regularniho vyrazu zamenis mezery za jeden oddelovac napr. '|'. Napr.:

        static void Main(string[] args) {
            CultureInfo customCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
            customCulture.NumberFormat.NumberDecimalSeparator = ".";
            Thread.CurrentThread.CurrentCulture = customCulture;

            StreamReader strReader = new StreamReader("TextFile1.txt");
            string line = String.Empty;
            string regPattern = @"\s+";
            Regex regReplace = new Regex(regPattern);
            while ( (line = strReader.ReadLine())!=null ) {
                string lineWithoutSpaces = regReplace.Replace(line.Trim(), "|");
                string[] values = lineWithoutSpaces.Split('|');
                Single val1, val2;
                if (values.Length == 1) {
                    Single.TryParse(values[0].Trim(), out val1);
                    Console.WriteLine("{0}", val1);
                }
                else {
                    Single.TryParse(values[0].Trim(), out val1);
                    Single.TryParse(values[1].Trim(), out val2);
                    Console.WriteLine("{0}\t{1}", val1, val2);
                }
            }
#if DEBUG
            Console.ReadKey();
#endif
        }

Je to priklad - nejsou osetreny vyjimky atp. Takze pokud copy&paste tak dodelat ;)

Editováno 13.8.2016 8:05
 
Nahoru Odpovědět
13.8.2016 8:04
Avatar
Jaroslav Trojan
Tvůrce
Avatar
Odpovídá na Honza
Jaroslav Trojan:13.8.2016 10:24

Ahoj Honzo,
podařilo se Ti přečíst ten soubor dat?
Když ano, tak mi napiš jak.
D í k y !

Nahoru Odpovědět
13.8.2016 10:24
statik
Avatar
Jaroslav Trojan
Tvůrce
Avatar
Odpovídá na Roman
Jaroslav Trojan:13.8.2016 10:27

To je snad v Céčku, já programuji ve Visual Basic.

Nahoru Odpovědět
13.8.2016 10:27
statik
Avatar
VitekST
Člen
Avatar
Odpovídá na Jaroslav Trojan
VitekST:13.8.2016 11:06

Není problém si to do Visual Basicu přepsat, použité třídy, metody, vlastnosti, ... jsou stejné.
Kdyžtak tady: http://converter.telerik.com

 
Nahoru Odpovědět
13.8.2016 11:06
Avatar
Roman
Člen
Avatar
Odpovídá na Jaroslav Trojan
Roman:13.8.2016 11:40

Presne jak pise kolega - neni problem to prepsat. Chtelo by pridat vic vlastni iniciativy! Ve VB .Net nedelam, ale abych dokazal jak jsou si kody podobne a tzn. snadno prepsatelne :

    Sub Main()
        Dim line As String = String.Empty
        Dim regReplace = New Regex("\s+")

        SetCulture()

        Using strR As New StreamReader("TextFile.txt")
            line = strR.ReadLine

            While line IsNot Nothing
                Dim lineWithoutSpaces As String, values() As String
                Dim val1, val2 As Single

                lineWithoutSpaces = regReplace.Replace(line.Trim, "|")
                values = lineWithoutSpaces.Split(New Char() {"|"})

                If values.Length = 1 Then
                    Single.TryParse(values(0).Trim, val1)
                    Console.WriteLine("{0}", val1)
                Else
                    Single.TryParse(values(0).Trim, val1)
                    Single.TryParse(values(1).Trim, val2)
                    Console.WriteLine("{0} {1}", val1, val2)
                End If
                line = strR.ReadLine
            End While
        End Using


#If DEBUG Then
        Console.ReadKey()
#End If


    End Sub

    Sub SetCulture()
        Dim customCulture = Thread.CurrentThread.CurrentCulture.Clone
        customCulture.NumberFormat.NumberDecimalSeparator = "."
        Thread.CurrentThread.CurrentCulture = customCulture
    End Sub

Jeste bych dodal - Lidi zkuste aspon obcas neco vyresit, nez jen cekat kdo vam reseni postne

 
Nahoru Odpovědět
13.8.2016 11:40
Avatar
Honza
Člen
Avatar
Odpovídá na Jaroslav Trojan
Honza:13.8.2016 16:11

Bohužel zasekl jsem se na na těch záporných číslem. Rozpsarsovat to a získat jednotlivé hodnoty není problém, ale nějak to nechce převést čísla se znaménkem mínus a zatím jsem nepřišel proč.

Nahoru Odpovědět
13.8.2016 16:11
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Jaroslav Trojan
Tvůrce
Avatar
Odpovídá na Roman
Jaroslav Trojan:15.8.2016 18:21

Velice děkuji Romane,
ten kód dobře pracuje, ten soubor to správně čte.
Jako začátečník bych to nedokázal napsat, tak ještě jednou d í k y.

Nahoru Odpovědět
15.8.2016 18:21
statik
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.