[php] [Laravel] mathiasverraes/money gebruiken in Laravel

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 09-09 12:00
Iemand hier die https://github.com/mathiasverraes/money gebruikt in Laravel? Zit toch met wat dingen die me heel vanzelfsprekend lijken, maar toch niet duidelijk zijn ofzo :X

- In een formulier laat je de klant € 9,95 invullen, niet 995 toch?
- Hoe van 9,95 naar 995 als integer voor Money?
- Met Eloquent mutators veld teruggeven als Money object is een goed idee denk ik?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use Money\Money;

class Product extends Model {

    public function getPriceAttribute($value)
    {
        return Money::EUR($value);
    }

    public function setPriceAttribute($value)
    {
        $this->attributes['price'] = Money::EUR(intval($value))->getAmount();
    }

}


Bij setPriceAttribute is $value een attribute geen integer, maar die 9,95 die de ingevuld is in het formulier. Los ik dat hier op, of in de controller?

Er is op Google genoeg te vinden over money en integers, maar directe voorbeelden voor implementatie in Laravel kon ik zo niet vinden :/.

Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
money als integer? Hell no! BC Math en GMP gebruiken strings.
Er zijn namelijk geen 2 cijfers achter de komma, dit kunnen er ook 4, 5, 6, etc. zijn.
Allemaal afhankelijk van percentage berekeningen (korting, btw, etc.)

Dat jij op de factuur/shop/kassabon twee cijfers achter de komma ziet, wil niet zeggen dat dat het is.

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Nu online
TheNephilim schreef op woensdag 25 november 2015 @ 12:59:
Iemand hier die https://github.com/mathiasverraes/money gebruikt in Laravel? Zit toch met wat dingen die me heel vanzelfsprekend lijken, maar toch niet duidelijk zijn ofzo :X

- In een formulier laat je de klant € 9,95 invullen, niet 995 toch?
- Hoe van 9,95 naar 995 als integer voor Money?
- Met Eloquent mutators veld teruggeven als Money object is een goed idee denk ik?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use Money\Money;

class Product extends Model {

    public function getPriceAttribute($value)
    {
        return Money::EUR($value);
    }

    public function setPriceAttribute($value)
    {
        $this->attributes['price'] = Money::EUR(intval($value))->getAmount();
    }

}


Bij setPriceAttribute is $value een attribute geen integer, maar die 9,95 die de ingevuld is in het formulier. Los ik dat hier op, of in de controller?

Er is op Google genoeg te vinden over money en integers, maar directe voorbeelden voor implementatie in Laravel kon ik zo niet vinden :/.
Zo te zien verwacht hij wel een integer:
PHP:
1
2
3
4
5
6
7
8
public function __construct($amount, Currency $currency)
{
    if (!is_int($amount)) {
        throw new InvalidArgumentException("The first parameter of Money must be an integer. It's the amount, expressed in the smallest units of currency (eg cents)");
    }
    $this->amount = $amount;
    $this->currency = $currency;
}


Maar er is ook een `stringToUnits` functie, om van een string dus een integer te maken.. Lijkt mij, dat als je de Money library wil gebruiken, je de value dus als integer kan opslaan (aangezien de library dat dus gebruikt altijd) en de currency los.
PHP:
1
2
3
4
5
6
7
public function setPriceAttribute($value)
{
    if ( ! is_int($value)) {
        $value = Money::stringToUnits($value)->getAmount();
    }
    $this->attributes['price'] = $value;
}


Je zou ook een los attribuut kunnen gebruiken om automatisch een money object te krijgen eventueel
PHP:
1
2
3
4
5
6
7
8
9
10
public function getMoneyAttribute($value)
{
    return new Money($this->price, $this->currency);
}

public function setMoneyAttribute(Money $value)
{
    $this->attributes['price'] = $value->getAmount();
    $this->attributes['currency'] = $value->getCurrency()->getName();
}

Acties:
  • 0 Henk 'm!

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 09-09 12:00
Inderdaad die stringToUnits functie is de oplossing. Dat ziet er dan zo uit:

PHP:
1
2
3
4
5
6
7
8
public function setPriceAttribute($value)
{
    if (!is_int($value)) {
        $value = Money::EUR(Money::stringToUnits($value))->getAmount();
    }

    $this->attributes['price'] = $value;
}


In het formulier krijg je dan nog wel dit, dat delen door 100:

HTML:
1
<input type="number" name="price" value="{{ $price->getAmount()/100 }}" min="0" step="0.01" />


Bedankt voor je input overigens!

Acties:
  • 0 Henk 'm!

  • PatrickH89
  • Registratie: November 2009
  • Laatst online: 11-09 23:26
TheNephilim schreef op woensdag 25 november 2015 @ 15:41:
[...]


Inderdaad die stringToUnits functie is de oplossing. Dat ziet er dan zo uit:

PHP:
1
2
3
4
5
6
7
8
public function setPriceAttribute($value)
{
    if (!is_int($value)) {
        $value = Money::EUR(Money::stringToUnits($value))->getAmount();
    }

    $this->attributes['price'] = $value;
}


In het formulier krijg je dan nog wel dit, dat delen door 100:

HTML:
1
<input type="number" name="price" value="{{ $price->getAmount()/100 }}" min="0" step="0.01" />


Bedankt voor je input overigens!
Is er geen method voor string/float style output? Ik gebruik sebastian/money en die heeft een getConvertedAmount method.

Acties:
  • 0 Henk 'm!

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 09-09 12:00
PatrickH89 schreef op woensdag 25 november 2015 @ 16:21:
[...]


Is er geen method voor string/float style output? Ik gebruik sebastian/money en die heeft een getConvertedAmount method.
De maker zegt zelf:
Formatting should, imho, be outside of the Money class, for example in a MoneyFormatting class. PRs welcome (and maintainers also welcome).

Acties:
  • 0 Henk 'm!

  • PatrickH89
  • Registratie: November 2009
  • Laatst online: 11-09 23:26
Omrekenen is wel nodig voor formatting, maar dat je omrekent betekent niet per se dat je wilt formatten. Maw, het is debatable of een dergelijke method er niet in thuishoort. Ik ben het wel met je eens dat voor het daadwerkelijk formatten je een andere class zou moeten gebruiken (of gewoon money_format() natuurlijk).

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 09-09 12:00
Dat is waar, misschien moet ik het extenden zodat ik niet steeds $price->getAmount()/100 hoef te doen. Stukje cleaner al!
Pagina: 1