This forum has moved to a new location and is in read-only mode. Please visit talk.octobercms.com to access the new location.
    nanohard
    
            
            
                    
                                            
        
    
        Trying to store money in a database as cents (integer).
If I add code to beforeSave() and use an integer, the code works. 80 becomes 8000 cents.
But if I use a decimal when the field is either type:text or type:number it gets rounded first. Not sure why this is. I also tried beforeValidate() and that didn't work at all. 8.10 becomes 8 instead of 810.
Here's the code I'm using:
public function beforeSave()
    {
        $length = strlen($this->pay_rate);
        if ( !strstr('.', $this->pay_rate) ) // without a decimal; this 'if' block works as intended; does not work with beforeValidate()
        {
            switch($length)
            {
                // if one or two digits, assume "dollars"
                case 1:
                case 2:
                    $this->pay_rate = $this->pay_rate . '00';
                    break;
                // if three or four digits, assume "cents"
                case 3:
                case 4:
                    break;
                // all else, set pay_rate to '0'
                default:
                    $this->pay_rate = '0';
                    break;
            }
        }
        // This block does not work, like it rounds it before it even gets to this point. Also tried beforeValidate() and it doesn't work.
        elseif ( strstr('.', $this->pay_rate))// && (strrpos($this->pay_rate , '.', -3)) ) // with two digits following a decimal
        {
            switch($length)
            {
                // if one or two digits, assume error (how to raise error message?)
                case 1:
                case 2:
                    $this->pay_rate = '0';
                    break;
                default:
                    $this->pay_rate = str_replace('.', '', $this->pay_rate);
                    break;
            }
        }
        else { $this->pay_rate = '0'; } // assume error, set pay_rate to '0'
    }
                            Last updated
    nanohard
    
            
            
                    
                                            
        
    
        Solved by moving the code (still in the model) to:
public function setPayRateAttribute($value)
    {
        $this->attributes['pay_rate'] = $value * 100;
    }
    public function getPayRateAttribute($value)
    {
        return $value / 100;
    }
                    1-2 of 2