Schienen 3. Wie werden zwei Dezimalstellen in Bearbeitungsform angezeigt?

70

Ich habe dieses Bearbeitungsformular.

Wenn ich jedoch etwas wie 1,5 speichere, möchte ich es als 1,50 anzeigen.

Wie könnte ich das mit dem Formularhelfer machen? <%= f.text_field :cost, :class => 'cost' %>

leonel
quelle

Antworten:

169

Sie sollten number_with_precisionHelfer verwenden. Siehe doc .

Beispiel:

number_with_precision(1.5, :precision => 2)
=> 1.50 

In dir bilden Helfer:

<%= f.text_field :cost, :class => 'cost', :value => (number_with_precision(f.object.cost, :precision => 2) || 0) %>

Übrigens, wenn Sie wirklich einen Preis anzeigen möchten, verwenden Sie number_to_currencydieselbe Seite für das Dokument (In einem Formularkontext möchte ich behalten number_with_precision, dass Sie nicht mit Geldsymbolen herumspielen möchten).


apneadiving
quelle
Genial und danke! Eine Randnotiz ist, dass die Verwendung von || 0verhindert, dass HTML5-Platzhalterwerte angezeigt werden, es sei denn, der Benutzer löscht den Wert. Das Löschen des Felds kann auch Probleme mit der numerischen Validierung verursachen (da ein leeres Wertattribut vorhanden ist, wenn Sie kein Wertattribut wünschen ). Nichts, was ein wenig JS nicht reparieren kann, aber es scheint, dass Rails in diesem Fall ein bisschen schlauer sein sollte.
Tom Harrison
10

Dafür verwende ich den Formatierer number_to_currency. Da ich in den USA bin, funktionieren die Standardeinstellungen für mich einwandfrei.

<% price = 45.9999 %>
<price><%= number_to_currency(price)%></price>
=> <price>$45.99</price>

Sie können auch Optionen übergeben, wenn die Standardeinstellungen für Sie nicht funktionieren. Dokumentation zu verfügbaren Optionen unter api.rubyonrails.org

Codesponge
quelle
7

Rails verfügt über eine Hilfsmethode number_to_currency , die möglicherweise besser zu Ihrem spezifischen Anwendungsfall passt.

Brian
quelle
Ich denke, die akzeptierte Antwort ist näher - number_to_currencyführt zu einer formatierten Zeichenfolge, die Rails nicht in einen Float umwandeln kann. number_with_precisionist wahrscheinlich die bessere Option.
Tom Harrison
@ TomHarrisonJr sicher, dass es auf einen Schwimmer zurückgeworfen werden kann. price = "$3.99"; price.slice!("$"); puts price.to_f => 3.99Es hängt nur von der gewünschten Benutzererfahrung ab. Einige möchten möglicherweise die Möglichkeit, ein Dollarzeichen in das Eingabefeld einzufügen. Ich weiß, ich mag die Option.
Bfcoder