Mai mult
Care este cea mai bună metodă de manipulare valută/bani?
Am'm de lucru pe o bază foarte cosul de cumparaturi sistem.
Am o tabela produse
care are o coloana "preț" de tip "întreg".
Am'm probleme cu afișarea prețului valoare în vedere pentru prețuri care includ atat de Euro și cenți. Am pierdut ceva evident cât de manipulare valută în Șine cadru este în cauză?
315
13
Te'll, probabil, doriți să utilizați un
ZECIMAL
tip în baza de date. În migrație, face ceva de genul asta:În Șine,
: zecimal
tip este returnat caBigDecimal
, care este mare pentru calcul pret.Daca insisti sa folosesti numere întregi, va trebui să manual converti la și de la `BigDecimal e peste tot, care, probabil, va deveni doar o durere.
După cum a subliniat de către mcl, pentru a imprima preț, utilizați:
Aici's o amendă, simplă abordare care foloseste
composed_of
(parte din ActiveRecord, folosind ValueObject model) și Banii gemTe'll nevoie
:pret
Scrie asta în produs.rb` fișier:
Ce-ai'll obține:
produs.preț.de cenți.to_s
O practică comună pentru manipularea valută este de a folosi tip zecimal. Aici este un exemplu simplu de la "Agile de Dezvoltare Web cu Șine"
Acest lucru vă va permite să se ocupe de preturi de la -999,999.99 999,999.99 De asemenea, poate doriți să includă o validare în elemente cum ar fi
de bun-simț verifica valorile tale.
Dacă utilizați Postgres (și când ne-am're în 2017 acum), ați putea dori să dea lor `:banii tip coloană o încercați.
Folosi de bani șine gem. Frumos se ocupă de bani și monede în modelul dvs. și, de asemenea, are o multime de ajutoare pentru a formata prețurile.
Folosind Virtual Atribute (Link-ul de la revizuită(plătit) Railscast), puteți stoca price_in_cents într-un număr întreg de coloană și se adaugă un atribut virtuală price_in_dollars în model produs ca un getter si setter.
Sursa: RailsCasts #016: Virtual Atribute: Virtual atribute sunt un mod curat de a adăuga câmpuri de formular care nu harta direct la baza de date. Aici voi arăta cum să se ocupe de validări, asociații, și mai mult.
Dacă cineva este folosind Continuarea migrației ar arata ceva de genul:
cumva Continuare ignoră :precizie și :scara
(Continuare Versiune: sequel (3.39.0, 3.38.0))
Eu sunt, folosind-o pe acest drum:
Desigur că moneda simbol, de precizie, format și așa mai departe depinde de fiecare monedă.
Cu siguranta integer.
Și chiar dacă BigDecimal din punct de vedere tehnic există
1.5
va da un pur Plutesc în Ruby.Doar un pic de actualizare și de coeziune din toate răspunsurile pentru unii aspiranți juniori/incepatori in RoR dezvoltare, care va veni cu siguranță aici pentru niște explicații.
De lucru cu banii
Folosesc:zecimal` pentru a stoca bani în DB, ca @molf sugerat (și de ce compania mea foloseste ca un standard de aur atunci când se lucrează cu bani).
Câteva puncte:
:zecimal va fi folosit ca
BigDecimal` care rezolvă o mulțime de probleme."precizie" și "scara" ar trebui să fie ajustate, în funcție de ceea ce te reprezintă
Dacă lucrați cu primirea și trimiterea de plăți,
precizie: 8 " și " scara: 2
dă999,999.99
ca cea mai mare sumă, care este bine în 90% din cazuri.Dacă trebuie să reprezinte valoarea de la o proprietate sau o masina rara, ar trebui să utilizați un mai mare "precizie".
Dacă lucrați cu coordonate (latitudine și longitudine), cu siguranta veti avea nevoie de o mai mare "scara".
Cum de a genera o migrare
Pentru a genera migrarea cu conținutul de mai sus, executați în terminal:
sau
așa cum sa explicat în acest blog post.
Valută formatare
KISS suplimentar biblioteci la revedere și de a folosi built-in de ajutoare. Folosesc number_to_currency` ca @molf și @facundofarias sugerat.
Pentru a juca cu number_to_currency
helper în Șine consola, trimite un apel la
ActiveSupport's
NumberHelper clasa pentru a avea acces la helper.De exemplu:
dă următoarea ieșire
Verificați alte "opțiuni" de number_to_currency helper.
În cazul în care pentru a pune
Puteți să-l pune într-o cerere de ajutor și să-l utilizați în interiorul punctele de vedere pentru orice sumă.
Sau puteți pune-l în "Articol" model ca o metodă de exemplu, și spune în cazul în care aveți nevoie pentru a formata preț (în vedere sau ajutoare).
Și, un exemplu cum folosesc
number_to_currency
în interiorul unui contrroler (observanegative_format
opțiune, utilizate pentru a reprezenta restituiri)Puteți trece unele opțiuni să
number_to_currency
(un standard Șine 4 vizualiza helper):Ca postat de Dylan Tables
Mea de fond al sistemului APIs au folosit de cenți pentru a reprezenta bani, iar eu am't vreau pentru a schimba asta. Nici eu nu am fost de lucru cu sume mari de bani. Așa că am pus asta o metoda de ajutor:
Care convertește întreg la un șir cu cel puțin trei cifre (adăugarea de zerouri inițiale, dacă este necesar), apoi introduce o virgulă, înainte de ultimele două cifre nu au folosit niciodată un "Float". De acolo, puteți adăuga orice valută simboluri sunt adecvate pentru cazul dumneavoastră de utilizare.
L's siguranță rapid și murdar, dar, uneori, ca's bine!
Cod simplu pentru Ruby & Șine