nree Skrevet 8. september 2009 Del Skrevet 8. september 2009 (endret) Har en variabel som har tallet 2389,50. Hvordan får jeg ut "beste" måte å betale dette til f.eks en kunde på (kontant)? Jeg vil ha ut f.eks. slik på beløpet 2389,50kr : 2 x 1000 kr 3 x 100 kr 1 x 50 kr 1 x 20 kr 1 x 10 kr 1 x 5 kr 2 x 2 kr 1 x 0,50 kr Er dette mulig på noe enkel måte? Endret 8. september 2009 av Goggen90 Lenke til kommentar
Jann - Ove Skrevet 8. september 2009 Del Skrevet 8. september 2009 Enkel deling og subtraksjon. Finn ut hvor mange ganger 1000 går opp i tallet. Legg i egen variabel for tusenlapper. Trekk beløpet for tusenlappene fra den oprinnelige summen, slik at du får en restsum. Fortsett videre nedover rekken av sedler og mynter vi har i Norge. Det er jo barneskolematte. Tenk. Lenke til kommentar
[kami] Skrevet 8. september 2009 Del Skrevet 8. september 2009 for å hinte videre.. bruk / og % operators. eks 26/10 = 2.5 (rund av til heltall) = 2 10 kroner 26%20 = 6 (6 i rest) 6/5 = 1.noe = 1 5 krone 6%5 = 1 (1 i rest) 1/1 = 1.. osv. Lenke til kommentar
luxus Skrevet 8. september 2009 Del Skrevet 8. september 2009 (endret) Løsning, i det fine språket Ruby (Hadde ikke PHP instalert, og halve motivasjonen med å løse dette var å leke med Ruby). penger_igjen = 2389.5 valoerer = [1000, 100, 50, 20, 10, 5, 2, 0.5] gruppert_paa_valoer = valoerer.inject({}) do |gruppert_paa_valoer, valoer| gruppert_paa_valoer[valoer] = (penger_igjen / valoer).floor penger_igjen %= valoer gruppert_paa_valoer end p gruppert_paa_valoer # {0.5=>1, 5=>1, 50=>1, 100=>3, 2=>2, 20=>1, 10=>1, 1000=>2} Endret 8. september 2009 av luxus Lenke til kommentar
nree Skrevet 8. september 2009 Forfatter Del Skrevet 8. september 2009 Jann - Ove: er klar over at det er mulig, men jeg lurte på om det var noe enklere måte enn det. luxus: PHP forum, ikke ruby, eller kan ruby kjøres i PHP? Lenke til kommentar
Ernie Skrevet 8. september 2009 Del Skrevet 8. september 2009 Er det så himla vanskelig å skjønne hva som står der da? Mine kunnskaper om Ruby er svært begrenset, men allikevel har jeg ingen problemer med å skjønne sånn cirka hva som foregår. Det er til og med nok til at jeg kan gi deg en «oversettelse» av det hele. $penger_igjen = 2389.5; $valoerer = array(1000, 100, 50, 20, 10, 5, 1, 0.5); $gruppert_paa_valoer = array(); foreach ($valoerer as $valoer) { $gruppert_paa_valoer[$valoer] = floor($penger_igjen / $valoer); $penger_igjen %= $valoer; } var_dump($gruppert_paa_valoer); Lenke til kommentar
nree Skrevet 8. september 2009 Forfatter Del Skrevet 8. september 2009 (endret) Det er himla vanskelig når du for det første aldri har hørt om ruby, og for det andre har begrenset PHP kunskaper. Derfor spør jeg her, slik at jeg kanskje lærer litt.. Hva gjør f.eks disse to linjene? $gruppert_paa_valoer[$valoer] = floor($penger_igjen / $valoer); $penger_igjen %= $valoer; Bør også legge til en liten if, på siste linje der, hvis ikke blir det deling på 0. if($penger_igjen !== 0) { $penger_igjen %= $valoer; } Jeg la til øreavrunding, og jeg måtte legge til at dersom desimalen er f.eks 50 (med 0 bakerst i de 2 desimalene) eller bare 5 måtte dette oppjusteres til 51 (siden php filtrerer bort alle 0 som står sist i desimaler. Noe bedre løsning på dette?) <?php $penger_igjen = 2887.40; $sum = $penger_igjen; $valoerer = array(1000, 500, 200, 100, 50, 20, 10, 5, 1); $gruppert_paa_valoer = array(); foreach ($valoerer as $valoer) { $gruppert_paa_valoer[$valoer] = $penger_igjen / $valoer; if($penger_igjen !== 0) { $penger_igjen %= $valoer; } } // 0.5 $sum = round($sum, 2); $zum = explode(".", $sum); $ore = $zum[1]; if(strlen($ore) == 1) { $ore = $ore."1"; } if($ore < 24) { $zum = $zum[0]; $femti_orer = 0; $krone = 0; } elseif($ore >= 25 and $ore <= 74) { $zum = $zum[0].".50"; $femti_orer = 1; $krone = 0; } elseif($ore >= 75 and $ore <= 99) { $zum = $zum[0]+1; $krone = 1; $femti_orer = 0; } echo "<p>"; echo "Kunden skal ha igjen $sum"; if($femti_orer == 0 && $krone == 0) { echo " - Øreavrunding: 0 ører"; } elseif($femti_orer == 1) { echo " - Øreavrunding: 50 ører"; } elseif($krone == 1) { echo " - Øreavrunding: + 1 krone"; } echo "</p>"; // Skriv ut penger, oppdelt i NOK, med øreavrunding foreach ($valoerer as $valoer) { $antall = floor($gruppert_paa_valoer[$valoer]); if($valoer == 1) { $antall = $antall + $krone; } echo($antall." x $valoer kr<br />"); } echo($femti_orer." x 0.5 kr"); ?> Gir ut: Kunden skal ha igjen 2887.4 - Øreavrunding: 50 ører 2 x 1000 kr 1 x 500 kr 1 x 200 kr 1 x 100 kr 1 x 50 kr 1 x 20 kr 1 x 10 kr 1 x 5 kr 2 x 1 kr 1 x 0.5 kr Endret 9. september 2009 av Goggen90 Lenke til kommentar
luxus Skrevet 9. september 2009 Del Skrevet 9. september 2009 Hva gjør f.eks disse to linjene? $gruppert_paa_valoer[$valoer] = floor($penger_igjen / $valoer); $penger_igjen %= $valoer; Den første linja finner ut hvor mange hele valører det er på pengene igjen. F.eks. 2300 / 1000 = 2,3. floor runder denne verdien ned til nærmeste heltall og vi sitter da igjen med antall hele 1000-lapper. Den neste linjen finner resten i delestykket og kalles Modulo opperator. 2300 % 1000 = 300, og det er den summen vi sitter igjen med når vi har trukkat fra de 2 hele tusenlappene fra det originale beløpet på 2300. Og jada, jeg vet det er et PHP-forum, men tenkte koden var ganske grei å forstå, selv om syntaxen er noe forskjellig hadde jeg hadde lyst å løse oppgaven i et språk jeg fortiden leker med. Lenke til kommentar
luxus Skrevet 9. september 2009 Del Skrevet 9. september 2009 Bør også legge til en liten if, på siste linje der, hvis ikke blir det deling på 0. if($penger_igjen !== 0) { $penger_igjen %= $valoer; } Nei, jeg tror ikke du trenger det. Du deler ikke der, du finner kun resten. En liten test: php -a Interactive shell php > print 0 % 1; 0 Lenke til kommentar
luxus Skrevet 9. september 2009 Del Skrevet 9. september 2009 Jeg la til øreavrunding, og jeg måtte legge til at dersom desimalen er f.eks 50 (med 0 bakerst i de 2 desimalene) eller bare 5 måtte dette oppjusteres til 51 (siden php filtrerer bort alle 0 som står sist i desimaler. Noe bedre løsning på dette?) PHP, og de fleste andre språk som jeg har vært borti, "filtrerer vekk" det siste tallet i 0.50 ja, men tallet er jo fortsatt det samme. Dersom du vil at PHP skal skrive ut et tall med to desimaler benytter du f.eks. number_format: php > print 0.50; 0.5 php > print number_format(0.50, 2); 0.50 Lenke til kommentar
nree Skrevet 10. september 2009 Forfatter Del Skrevet 10. september 2009 Tusen takk luxus, fikk feilmelding når jeg ikke hadde "beskyttelse" for deling på 0. Scriptet fungerte, men fikk division by zero feilmelding. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå