Moi,
Olen kauan yrittänyt keksiä miten tehdä laskutoimituksen, joka tarkastelee txt-taulukosta joka 4 ja 5 kohdasta ja tekee loppusumman silloin kun taulukkoa näytetään sivulla. Saatu laskusumma ei siis tarvitse tallentaa tuohon taulukkoon. Onko mitään kätevää ja simppeli skripti joka laskee nuo taulukossa olevat luvut?
1349112455|3.9.2012|Helsinki||2,70e|2,70e|||| 1349112487|4.9.2012|Helsinki||2,70e|2,70e|||| 1349112503|5.12.2012|Vantaa||4,50e|4,50e|||| 1349112522|6.9.2012|Helsinki||2,70e|2,70e||||
Summa tarkoittaa yhteenlaskua. Eli teet muuttujan, jonka alustat nollaksi. Kunkin rivin kohdalla lisäät sen luvun ko. muuttujaan (useimmissa kielissä lisääminen tapahtuu + operaattorilla). Lopussa muuttujassa on kaipaamasi summa.
Grez kirjoitti:
Summa tarkoittaa yhteenlaskua. Eli teet muuttujan, jonka alustat nollaksi. Kunkin rivin kohdalla lisäät sen luvun ko. muuttujaan (useimmissa kielissä lisääminen tapahtuu + operaattorilla). Lopussa muuttujassa on kaipaamasi summa.
Kiitos, löytyisikö ohjeita tähän mistään? Taitoni alkaa olemaan kovassa ruosteessa kun en ole moneen vuoteen koodaanut mitään.
No riippuu hirveästi kielestä millä olet tekemässä. Esimerkiksi PHP:ssä muuttujan voisi määrittää ja alustaa nollaksi seuraavasti:
$summa = 0;
Myöskin järkevän käytännön ohjeen antaminen rivillä olen luvun lisäämisestä edellyttäisi, että tietäisi miten käsittelet niitä rivejä tällä hetkellä. Mutta jos nyt vaikka tekisit PHP:llä lisättävä luku olisi muuttujassa $row['luku'] niin lisääminen onnistuisi koodilla
$summa += $row['luku'];
Nyt tässä edistyy jotain, mutta loppusumma on täysin väärä.
Koodina seuraavasti:
for ($i = 0; $i < $viestimaara; $i++) { $tiedot = explode("|", $viestit[$i], 11); $summa = 0; $summa += $tiedot['10']; echo $summa; }
Php tulosti summaksi 00000000000000000014184496.5936.47.47.42
Txt-taulukossa näkyy tältä (pitää laskea siis viimeisin kohta (10).
349194421|16.2.2012|Helsinki|Laskutesti|2,70e|2,70e|||10e||14 1349194481|laskutesti|Ei valittu||Ei valittu|Ei valittu|10|5|3||18 1349194503||Ei valittu||2,70e|2,70e|||||4 1349194546||Ei valittu||2,70|2,70|||||4 1349194555||Ei valittu||4.50|4.50|||||9 1349194971||Ei valittu||2.70|4.50|||||6.5 1349195000||Ei valittu||4.50|4.50|||||9 1349195124||Ei valittu||2.70|2.70|11|10|10||36.4 1349195142||Ei valittu||2.70|2.70|1.10|1.00|||7.4 1349195248||Ei valittu||2.70|2.70|1.10|1.10|||7.4 1349195265||Ei valittu||Ei vlitt|Ei vlitt|1.11|1.12|||2
Huomasin muuten äsken, ettei yhteenlasku ole oikein tossa 10.rivissä, summan pitäisi olla 7,60e mutta php laski sen 7,40euroksi..?
Alusta se nollaksi ennen looppia ja tulosta tulos vasta loopin jälkeen
Jos jokaisella rivillä laitat muuttujan arvoksi nolla ja lisäät siihen ko. rivin arvon niin silloinhan se muuttuja on sama kuin rivin arvo ja kun vielä tulostat sen jokaisella rivillä, niin jokaisen rivin arvo tulostuu.
Grez kirjoitti:
Alusta se nollaksi ennen looppia ja tulosta tulos vasta loopin jälkeen
Jos jokaisella rivillä laitat muuttujan arvoksi nolla ja lisäät siihen ko. rivin arvon niin silloinhan se muuttuja on sama kuin rivin arvo ja kun vielä tulostat sen jokaisella rivillä, niin jokaisen rivin arvo tulostuu.
Niin pitääkin, laitoin ne ennen ja jälkeen loopia, ja tulos tuli. Kiitos paljon. Onko PHP:n laskutoimitus niin luotettava? Outoa kun 2,70+2,70+1,10+1,10e tuli summaksi 7.40e. Koodi näyttää täältä
$tulos = $_POST['matka1'] + $_POST['matka2'] + $_POST['matka3'] + $_POST['matka4'] + $_POST['muitakuluja'];
Kokeiles vaikka tulostaa post muuttujien arvot ja katsoa onko siellä jotain outoa.
Joo, print_r($_POST); olisi kova juttu. Varmaan toi muitakuluja on -0.2
tneva82 kirjoitti:
Kokeiles vaikka tulostaa post muuttujien arvot ja katsoa onko siellä jotain outoa.
Tulostuksessa ennen laskua summat näyttävät oikealta, virhe on siis tapahtunut laskuvaiheessa.
Vika tuskin on laskuvaiheessa, mutta arvojen muutto numeroiksi voi kusta tms. Edelleen jos viitsit laittaa tuon print_r($_POST) ennen tuota riviä ja kopioida tulosteen sellaisenaan niin voimme kertoa missä vika on.
Grez kirjoitti:
masiaro kirjoitti:
virhe on siis tapahtunut koodausvaiheessa
Korjasin uskottavammaksi
Heh, tottakai koodissa pitää olla jotain vikana. Koodi näyttää tältä. Äsken siis kokeilin poistaa $_POST koska sitä on kerran tehty, eipä auttanyt. Nyt näyttää 6.50e, eli jompikumpi 1,10e on jäänyt laskematta.
$tiedosto = fopen("data/$tunnus-$kuukausi.txt", "a") or exit("Tietokantaan ei saatu yhteyttä"); //haetaan lomakkeen kautta tulleet muuttujat $paiva = $_POST['paiva']; $paikka = $_POST['paikka']; $muupaikka = $_POST['muupaikka']; $matka1 = $_POST['matka1']; $matka2 = $_POST['matka2']; $matka3 = $_POST['matka3']; $matka4 = $_POST['matka4']; $muitakuluja = $_POST['muitakuluja']; $selitys = $_POST['selitys']; $search = array(',', 'e', 'u', 'r', 'o', 'a', '€'); $replace = array('.', '', '', '', '', '', ''); $matka1 = str_replace($search, $replace, $matka1); $matka2 = str_replace($search, $replace, $matka2); $matka3 = str_replace($search, $replace, $matka3); $matka4 = str_replace($search, $replace, $matka4); $muitakuluja = str_replace($search, $replace, $muitakuluja); $tulos = $matka1 + $matka2 + $matka3 + matka4 + muitakuluja; //poistetaan ylimääräiset kenoviivat (\) $viesti = stripslashes($viesti); //estetään HTML-tagien käyttäminen $viesti = htmlspecialchars($viesti); $nimi = str_replace("|", "I", $nimi); $email = str_replace("|", "I", $email); //muutetaan rivinvaihdot HTML-muotoon $viesti = str_replace("\n", "<br>", $viesti); //otetaan talteen aika, jolloin viesti lähetettiin $aika = time(); //muodostetaan tiedostoon tallennettava rivi $rivi = "$aika|$paiva|$paikka|$muupaikka|$matka1|$matka2|$matka3|$matka4|$muitakuluja|$selitys|$tulos\n"; //kirjoitetaan rivi tiedostoon fwrite($tiedosto, $rivi); //suljetaan tiedosto fclose($tiedosto); header("Location: matkakorvaus.php");
masiaro kirjoitti:
Heh, tottakai koodissa pitää olla jotain vikana.
$tulos = $matka1 + $matka2 + $matka3 + matka4 + muitakuluja;
Tuosta puuttuu pari $ -merkkiä. Huomaatko mistä kohdista?
Ei siis millään pahalla, mutta on melkoisesti todennäköisempää että koodissa tai syöttöarvoissa olisi vikaa, kuin että PHP laskisi noin paljon väärin. (Pyöristysvirheitä voi toki tulla jossain 10. desimaalin paikkeilla)
Grez kirjoitti:
masiaro kirjoitti:
Heh, tottakai koodissa pitää olla jotain vikana.
$tulos = $matka1 + $matka2 + $matka3 + matka4 + muitakuluja;Tuosta puuttuu pari $ -merkkiä. Huomaatko mistä kohdista?
Ei siis millään pahalla, mutta on melkoisesti todennäköisempää että koodissa tai syöttöarvoissa olisi vikaa, kuin että PHP laskisi noin paljon väärin. (Pyöristysvirheitä voi toki tulla jossain 10. desimaalin paikkeilla)
Hassua etenkin tällä koodi oli kohdallaan, silti lasku oli väärä:
$tulos = $_POST['matka1'] + $_POST['matka2'] + $_POST['matka3'] + $_POST['matka4'] + $_POST['muitakuluja'];
Ja kun poistin POST:t, multa jäi huomaamatta että poistin myös $:t. Nyt summa näyttää oikealta, 7,60e kuten pitääkin. Eli ensimmäisessä POST-koodissa antoi vääriä arvoja?
Niin, olisko esim. matka3 ja matka4 arvot olleet 1,1 (eikä 1.1) jolloin PHP ei olisi ymmärtänyt niitä oikein. Ei voi koskaan tietää kun et laittanut sitä print_r($_POST) tulostetta kuten pyysin.
Grez kirjoitti:
Niin, olisko esim. matka3 ja matka4 arvot olleet 1,1 (eikä 1.1) jolloin PHP ei olisi ymmärtänyt niitä oikein. Ei voi koskaan tietää kun et laittanut sitä print_r($_POST) tulostetta kuten pyysin.
Kuten tässä rivissä näkyy selvästi, millaista tietoa lomakkeesta saatiin. Siinä oli piste, eikä pilkku.
1349195248||Ei valittu||2.70|2.70|1.10|1.10|||7.4
Muuten kiitoksia paljon, homma pääsi eteenpäin.
Niin ja edellenkään
1) tuo ei ole print_r($_POST) tuloste.
2) tuolla laittamallasi rivillä $_POST -arvot eivät ole käsittelemättömässä muodossaan
3) Koodissasi (jolla sen todennäköisesti tulostit) korvaat pilkut pisteellä.
Eli edellisessä viestissäni antamani selitys asialle on edelleen kaiken kertomasi tiedon valossa se todennäköisin selitys.
Kaiken kaikkiaan pointti oli se, että jos laittaisit suoraan syötteen sellaisena kuin se on ja koodin joka tuottaa virheellisen tuloksen, niin pystyisimme useimmissa tapauksissa kertomaan suoraan mikä vika on ja miten se korjataan. Näin ei tarvitsisi hieroa montaa viestiä yksinkertaista asiaa ja kaivaa tietoja kuin hammaslääkärissä hammasta.
masiaro kirjoitti:
Kuten tässä rivissä näkyy selvästi, millaista tietoa lomakkeesta saatiin. Siinä oli piste, eikä pilkku.
1349195248||Ei valittu||2.70|2.70|1.10|1.10|||7.4Muuten kiitoksia paljon, homma pääsi eteenpäin.
Kuten Grez jo sanoikin vika oli joko lomake päässä tai tiedon syöttäjän päässä, taikka molemmisa, sillä toi koodi, minkä pastetit tuossa aluksi toimi mulla ihan täysin, ongelmitta(toki laitoin ne muutamat dollarit sinne) vaikka laittoi lomakkeissa pilkut pisteiden sijaan.
Ja muuten kannattanee käyttää tuon vanhan fopen funktion sijaan file_put_contents()-functiota. Esimerkki Putkan oppaassa
file_put_contents("rivit.txt", $rivit, FILE_APPEND);
Edit.
Tässä olisi tällänen pikkunen vinkki(Taikasana funktio):
<?php //Kannattanee käyttää funktiota, jos pitää useasti tehdä sama asia. function parse($data){ $data = str_replace(",", ".", $data); return preg_replace("/[^0-9.]/", "", $data); } $matka1 = parse($_POST['matka1']); $matka2 = parse($_POST['matka2']); $matka3 = parse($_POST['matka3']); $matka4 = parse($_POST['matka4']); $muitakuluja = parse($_POST['muitakuluja']); $tulos = $matka1 + $matka2 + $matka3 + $matka4 + $muitakuluja; ?>
Aihe on jo aika vanha, joten et voi enää vastata siihen.