如何将价格正确存储为DB中的整数?

时间:2018-08-15 22:08:35

标签: php laravel

我有一个像这样的价格:

<div>
    <label for="price">Price</label>
    <input type="hidden" name="price" id="price"/>
    <input type="number"
           onkeydown="javascript: return event.keyCode == 69 ? false : true"
           min="0" step="any"
           class="form-control"
           value="{{ old('price') }}"
           name="price" id="price" placeholder="Price (Ex: 10,00)"/>
</div>

如果用户为求职者介绍“ 10.15”,则$ request-> all()会显示此字段,如:

  "price" => "10.15"

但是在数据库中,价格存储为10。我将列价格作为整数。然后,我还有一个页面,可以在其中编辑价格,并且表单字段中的价格显示为“ 10”,但是应该为“ 10.15”。

您知道如何在数据库中存储值“ 10.15”并在编辑页面中显示正确的值“ 10.15”吗?

在控制器中,价格存储在DB中,例如:

'price' => $request->price,

3 个答案:

答案 0 :(得分:0)

货币值应存储在数据库中的十进制字段而不是整数中。

答案 1 :(得分:0)

您的数据类型应为Float或double或带有小数点的任何内容以小数点形式显示。整数(通常称为int)是不带小数点的数字。浮点数是浮点数。

因此,在您的mysql数据类型,Javascript和任何语言中,您使用的int不应为int,否则将四舍五入。

尝试将表更改为浮点数,然后重新插入另一个浮点数(已插入的数字不会被影响,因为它们已经四舍五入了),您将看到它现在以浮点数存储点。

但是正如乔纳森(Jonathan)所说,永远不要将货币存储为浮点数,而是将其存储为尽可能小的大小,并在每次需要放置小数点时重新计算。 < / p>

答案 2 :(得分:-2)

更新:似乎很少有人不喜欢它,谷歌快速搜索表明钱应该以最小的单位存储。就美元而言,这意味着几美分。无论如何,堆栈不会让我删除可接受的答案。

如果您的ORM扩展了元素模型,则应在模型中使用getPriceAttribute()和setPriceAttribute($ val)。另外,我不同意其他答案。我会将价格存储为基于便士的整数,然后使用getter和setter产生小数。 (仅供参考:条纹等现代商业解决方案使用的是美分整数,而不是小数)

Product extends Model{
    public function getPriceAttribute(){
        return $this->attributes['price'] /100;
    }
    public function setPriceAttribute($val){
        $this->attributes['price'] = $val * 100;
    }
}

用法:

$myProduct->price = 69.69;
echo $myProduct->price;