NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s podporou uplatnění od 0 Kč. Více informací.

Diskuze: ASP.NET WebForms string.Format pomocí smyčky a následné vložení dat do DB tabulky

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
m.zimcik
Člen
Avatar
m.zimcik:14.3.2016 16:44

Zdravím,

pracuji na projektu (bakalářská práce) pro jednu neziskovou organizaci, jedná se o jednoduchou účetní webovou aplikaci. Vše mi funguje jak má, ale dostal jsem se k problému, který se budu snažit vysvětlit pomocí následujícího kódu

protected void Submit(object sender, EventArgs e)
    {
        if (!string.IsNullOrEmpty(Request.Form["Doklad"]) && !string.IsNullOrEmpty(Request.Form["MD"])
            && !string.IsNullOrEmpty(Request.Form["Dal"]) && !string.IsNullOrEmpty(Request.Form["Cinnost"])
            && !string.IsNullOrEmpty(Request.Form["Cástka"]) && !string.IsNullOrEmpty(Request.Form["Datum"]))
        {
            //Fetch the Hidden Field values from the Request.Form collection.
            string[] Doklads = Request.Form["Doklad"].Split(',');
            string[] MDs = Request.Form["MD"].Split(',');
            string[] Dals = Request.Form["Dal"].Split(',');
            string[] Cinnosts = Request.Form["Cinnost"].Split(',');
            string[] Cástkas =  Request.Form["Cástka"].Split(',');
            string[] Datums = Request.Form["Datum"].Split(',');

            //Loop through the values and insert into database table.
            for (int i = 0; i < Doklads.Length; i++)
            {
                string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
                using (SqlConnection con = new SqlConnection(constr))
                {
                    using (SqlCommand cmd = new SqlCommand("INSERT INTO prehled VALUES(@Doklad, @MD, @Dal, @Cinnost, @Cástka, @Datum)"))
                    {
                        cmd.Parameters.AddWithValue("@Doklad", Doklads[i]);
                        cmd.Parameters.AddWithValue("@MD", MDs[i]);
                        cmd.Parameters.AddWithValue("@Dal", Dals[i]);
                        cmd.Parameters.AddWithValue("@Cinnost",Cinnosts[i]);
                        cmd.Parameters.AddWithValue("@Cástka", string.Format("{0:0,0.00}", Cástkas[i]));
                        cmd.Parameters.AddWithValue("@Datum", Datums[i]);
                        cmd.Connection = con;
                        con.Open();
                        cmd.ExecuteNonQuery();
                        con.Close();
                    }
                }
            }
            ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('Úspěšně zaúčtováno!')", true);
            //DOŘEŠIT OZNAMOVACÍ OKNO S RESPONSE.REDIRECT

        }
        else
        {
            //Refresh the page to load GridView with records from database table.
            Response.Redirect(Request.Url.AbsoluteUri);
        }
    }

První co je, tak je podmínka, která zkontroluje všechny hodnoty, které jsou následně odeslány pomocí Request.Form, následuje klasická smyčka, která vepíše hodnoty do databáze.
Vše funguje bez problémů, jenže u proměnné Cástka nemůžu za boha najít způsob jak zapsat např. hodnotu 120.54, jak jde vidět, zkoušel jsem pomocí metody String.Format nastavit desetinné čísla což nefunguje. Hodnota se zapíše, ale v celých číslech.
Datový typ u Cástky je nastaven na float.

Budu rád za jakékoliv tipy, rady, pomoci díky předem Michal

Editováno 14.3.2016 16:45
 
Odpovědět
14.3.2016 16:44
Avatar
m.zimcik
Člen
Avatar
m.zimcik:14.3.2016 16:49

a ještě jsem zapomněl, poté co jsou data úspěšně zapsána do tabulky, následuje vyskakovací okno s hláškou Úspěšně zaúčtováno docela by se mi hodilo ještě poradit, jak udělat to, že po kliknutí na ok se využije
Response.Redi­rect(Request.Ur­l.AbsoluteUri); a stránka se refreshne

 
Nahoru Odpovědět
14.3.2016 16:49
Avatar
Odpovídá na m.zimcik
sadlomaslox25:14.3.2016 20:11

a kdyz napises
cmd.Parameter­s.AddWithValu­e("@Cástka", 120.54);
tak se ulozi do databaze co ?

 
Nahoru Odpovědět
14.3.2016 20:11
Avatar
m.zimcik
Člen
Avatar
Odpovídá na sadlomaslox25
m.zimcik:14.3.2016 20:52

ahoj ano, pokud jsem zadal hodnotu "natvrdo" tak se mi to číslo tudíž 120.54 zapsalo bez problémů. Můžeš trošku tu tvou myšlenku rozšířit? díky :)

Editováno 14.3.2016 20:54
 
Nahoru Odpovědět
14.3.2016 20:52
Avatar
Odpovídá na m.zimcik
sadlomaslox25:14.3.2016 21:11

string.Format neresi problem prevodu mezi stringem a floatem. ty se pokousis stale zapsat retezec do sloupce typu string. resenim je prevest si v c# ten string na float.
cmd.Parameter­s.AddWithValu­e("@Cástka", Convert.ToSin­gle(Cástkas[i]));

nebo float.Parse, float.TryParse

 
Nahoru Odpovědět
14.3.2016 21:11
Avatar
m.zimcik
Člen
Avatar
Odpovídá na sadlomaslox25
m.zimcik:14.3.2016 21:19

díky moc, momentálně už nejsem na PC, ale hned zítra to vyzkouším a dám vědět. Jde vidět, že jsem ještě v začátcích a neuvědomil jsem si (jako už poněkolikáté), že hodnotu float do stringu prostě nenarvu :D

 
Nahoru Odpovědět
14.3.2016 21:19
Avatar
Antonín Tonini:15.3.2016 7:52

Na měnu se float vůbec nehodí. Hodnota 120.54 je typu double (zkus si deklarovat float s desetinnou čárkou -> nepůjde to, muselo by to být ve formátu 120.54f. K tomu je tam problém se zaokrouhlováním.

float x = 3.5f;
float y = 0.1f;
float z = 3.6f;
Console.WriteLine("x+y: {0}", x+y);
Console.WriteLine("z: {0}", z);
Console.WriteLine("x+y==z?: {0}", (x + y) == z); // hodí false

Spíše použij datový typ decimal.
http://www.noelherrick.com/…al-for-money
http://stackoverflow.com/…ent-currency

 
Nahoru Odpovědět
15.3.2016 7:52
Avatar
m.zimcik
Člen
Avatar
m.zimcik:15.3.2016 12:15

Zdravím,

zkoušel jsem všechny Vaše rady, ale zatím sem nedošel k úspěšnému konci. vyzkoušel jsem:

cmd.Parameters.AddWithValue("@Cástka", Convert.ToSingle(Cástkas[i]));
cmd.Parameters.AddWithValue("@Cástka", Convert.ToDouble(Cástkas[i]));
cmd.Parameters.AddWithValue("@Cástka", Convert.ToDecimal(Cástkas[i]));

to stejné sem zkoušel se všema možnýma variantama přes parse, dokonce jsem zkoušel i deklarovat desetinnou čárku pro float přes string.Format, ale vždy to zapsalo pouze celé číslo, jsem z toho jelen, protože ještě využívám LINQ pro CRUD metodu, kde mi následně úprava na desetinné místa funguje bez problémů...

Jestli vás ještě něco napadá budu vděčný díky

 
Nahoru Odpovědět
15.3.2016 12:15
Avatar
Odpovídá na m.zimcik
sadlomaslox25:15.3.2016 19:42

napis sem presne obsah promene Cástkas[i]. budto tam mas nejaky nepovoleny symbol jako "20.55 Kč" nebo zadavas desetinou carku zatimco system/aplikace bezi pod anglickou verzi takze nebere carku jako validni desetini oddelovac.
nebo tady
string[] Cástkas = Request.Form["Cás­tka"].Split(',');
pokud pouzivas desetinou carku na ceske lokalizaci tak se ti to logicky rozsekne na cele cislo a desetinou cast kterou nejspis pak ignorujes.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
15.3.2016 19:42
Avatar
m.zimcik
Člen
Avatar
m.zimcik:15.3.2016 20:17

tak problém je vyřešen, chyba byla, že bylo třeba změnit

string[] Cástkas = Request.Form["Cástka"].Split(',');

na

string[] Cástkas = Request.Form["Cástka"].Split('.');

neboli jak si říkal, používal sem čárku jako rozdělovač u desetinných míst a ten split to nějak rozsekával a tu čárku ignoroval, dík moc

 
Nahoru Odpovědět
15.3.2016 20:17
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 10 zpráv z 10.