Gå til innhold

[Løst]Kategorisere "penger tilbake", f.eks. 1 stk 1000kr, 2 stk 10kr ut fra et tall.


Anbefalte innlegg

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 av Goggen90
Lenke til kommentar
Videoannonse
Annonse

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

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 av luxus
Lenke til kommentar

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

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 av Goggen90
Lenke til kommentar
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
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
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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...