【问题标题】:How to set the database to accept currency values?如何设置数据库接受货币值?
【发布时间】:2023-04-04 04:32:01
【问题描述】:

我正在使用Sequel 编写Sinatra 应用程序。我第一次尝试添加货币。网上查了一下我用Numeric作为值,当然需要小数点精度了。

我知道在 MySQL 中,NumericDecimal 是相同的。所以我想知道我在这里做错了什么。我觉得我需要以某种方式定义小数点。这是我的模型:

# Contracts table: Here the users can define their contracs
DB.create_table?(:contracts, engine: 'InnoDB') do
    primary_key :id
    Integer :user_id,   null: false
    String  :name,      null: false
    String  :description
    Numeric :cost,      null: false
end

每次我尝试提交带小数点的值时,我都会收到以下错误,我认为这是一个验证错误。我还没有明确使用验证,所以我认为它是 Sequel 或 MySQL 特定的。

我应该如何更改我的模型以允许我添加十进制值?

编辑:根据要求,我添加了我的控制器(路由)文件:

class Metro < Sinatra::Base
    get "/user_add_contract" do
        protected!
        haml :user_add_contract
    end

    post "/user_add_contract" do
        protected!
        user = session['name']
        begin
            uid = User.first(username: user)
            Contract.create(user_id: uid[:id], name: params['name'], description: params['description'], cost: params['cost'].to_f)
            redirect '/user_list_contract'
        rescue Exception => e
            @error = e
            haml :details_error
        end


    end

end

和 HAML(视图):

%form(action="/user_add_contract" method="post")
  %fieldset
    %legend Φόρμα Νέου Συμβολαίου
    %div{class: 'column1of2'}
      %ul
        %li
          %label(for="name")Ονομασία:
          %input#name(name="text" name="name")
        %li
          %label(for="description")Περιγραφή:
          %textarea.email#description(type="text" name="description")
        %li
          %label(foor="cost")Κόστος:
          %input#cost(type="number" name="cost")
        %li
          %input(type="submit" value="Εγγραφη") ή <a href="/panel">Ακύρωση</a>

谢谢

【问题讨论】:

  • 你能发布代码来展示你如何处理输入值吗?另外,错误是立即出现还是在您点击提交时出现?
  • @acsmith 当然,这里涉及到另外两个文件。我不确定在视图 (HAML) 中 %input#cost(type="number" name="cost") 行是否可以接受浮点数或小数,而不是输入“数字”。
  • 是的,但是@acsmith,因为您的洞察力使我找到了正确的答案,如果您想写下答案,以便我今天晚些时候投票。 :-)
  • 嗯显然又出现了另一个问题。现在它将值保存在数据库中,但不保存小数,所以当我发出 80.34 时,我可以在数据库中看到值 '80' 而不是 80.34

标签: mysql ruby sinatra sequel


【解决方案1】:

相关回答:How to handle floats and decimal separators with html5 input type number

step="" 属性在此处默认为 1,这意味着它将截断小数点后的所有内容(或退回错误,具体取决于设置方式和您使用的浏览器)。

尝试在输入元素上设置step="0.01",假设您只想找到最近的分,看看是否可行。您的代码中的其他所有内容看起来都很好。*

  • 除非您的费用中有“foor”而不是“for”&lt;label&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多