Diskuze: Převod řetězce na typ Single

C# .NET .NET (C# a Visual Basic) Převod řetězce na typ Single American English version English version

Avatar
Jaroslav Trojan:

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. srpna 11:32
Avatar
Honza
Člen
Avatar
Odpovídá na Jaroslav Trojan
Honza:

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. srpna 12:03
Nahoru Odpovědět 12. srpna 12:01
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Odpovídá na Honza
Jaroslav Trojan:

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. srpna 12:15
Avatar
Dušan Neckař:

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. srpna 13:00
 
Nahoru Odpovědět 12. srpna 12:58
Avatar
Honza
Člen
Avatar
Odpovídá na Dušan Neckař
Honza:

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. srpna 13:26
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
roman_8253
Člen
Avatar
Odpovídá na Jaroslav Trojan
roman_8253:

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. srpna 8:05
 
Nahoru Odpovědět 13. srpna 8:04
Avatar
Odpovídá na Honza
Jaroslav Trojan:

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. srpna 10:24
Avatar
Odpovídá na roman_8253
Jaroslav Trojan:

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

 
Nahoru Odpovědět 13. srpna 10:27
Avatar
VitekST
Člen
Avatar
Odpovídá na Jaroslav Trojan
VitekST:

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. srpna 11:06
Avatar
roman_8253
Člen
Avatar
Odpovídá na Jaroslav Trojan
roman_8253:

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  +2 13. srpna 11:40
Avatar
Honza
Člen
Avatar
Odpovídá na Jaroslav Trojan
Honza:

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. srpna 16:11
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Odpovídá na roman_8253
Jaroslav Trojan:

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  +1 15. srpna 18:21
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.