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

C# .NET .NET (C# a Visual Basic) ASP.NET WebForms string.Format pomocí smyčky a následné vložení dat do DB tabulky American English version English version

Avatar
m.zimcik
Člen
Avatar
m.zimcik:

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. března 16:45
 
Odpovědět 14. března 16:44
Avatar
m.zimcik
Člen
Avatar
m.zimcik:

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. března 16:49
Avatar
Odpovídá na m.zimcik
sadlomaslox25:

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

 
Nahoru Odpovědět 14. března 20:11
Avatar
m.zimcik
Člen
Avatar
Odpovídá na sadlomaslox25
m.zimcik:

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. března 20:54
 
Nahoru Odpovědět 14. března 20:52
Avatar
Odpovídá na m.zimcik
sadlomaslox25:

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. března 21:11
Avatar
m.zimcik
Člen
Avatar
Odpovídá na sadlomaslox25
m.zimcik:

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. března 21:19
Avatar
Antonín Tonini:

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  +1 15. března 7:52
Avatar
m.zimcik
Člen
Avatar
m.zimcik:

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. března 12:15
Avatar
Odpovídá na m.zimcik
sadlomaslox25:

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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +1 15. března 19:42
Avatar
m.zimcik
Člen
Avatar
m.zimcik:

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. března 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.