2010-10-19 2 views
4

Je souhaite stocker des devises dans mes bases de données (sqlite et mysql). J'essaie d'utiliser le type de colonne decimal, avec :scale => 2.Comment configurer Rails pour générer des nombres décimaux avec la précision correcte dans les champs de formulaire?

Ceci ne se comporte pas comme prévu. Si j'enregistre un enregistrement avec :rate => 10.50, il est stocké dans mon sqlite db sous la forme 10.5. En outre, lorsque je génère la valeur dans un champ de formulaire, il est affiché comme 10.5.

Je ne veux pas faire de mise en forme hacky chaîne chaque fois que je veux bien afficher les valeurs dans les formulaires Rails.

Existe-t-il un moyen de contourner ce problème? Est-ce une chose sqlite? Est-ce que je viens de mal comprendre le type de colonne decimal?

Edit:

Pour clarifier les choses, je veux pouvoir utiliser si les méthodes de génération de forme habituelle:

- form_for @project do |f| 
    = f.text_field :rate 

Si je dois formater explicitement la sortie, je vais devoir créer méthodes supplémentaires pour chaque attribut décimales:

def formatted_rate 
    "%.2f" % rate 
end 

= f.text_field :formatted_rate 

Existe-t-il d'autres astuces communes pour forcer la mise en forme de sortie, et toujours utiliser la définition ault Rails formbuilder?

+1

Il n'y a rien de «hacky» à propos du codage de vos vues pour afficher vos chiffres à deux décimales; C'est la solution idéale. Lorsque vous spécifiez une précision décimale, vous spécifiez un maximum et non un minimum. Les nombres ne seront jamais stockés avec des zéros de fin ou de début. – meagar

+1

Bien que n'étant pas un doublon * exact *, ces réponses sont presque toutes applicables: http://stackoverflow.com/questions/591939/how-can-a-format-the-value-shown-in-a-rails-edit- field – meagar

Répondre

1

Je fini par écrire un plugin pour le faire: currency_text_field.

Vous pouvez définir vos formats (arguments à number_with_precision) dans config/initializers/currency_text_field_initializer.rb.

Ensuite, vous utilisez f.currency_text_field :rate dans votre formulaire, avec un argument optionnel :format pour utiliser un format nommé dans l'initialiseur. Sinon, il utilise le format[:default] à partir de l'initialiseur.

Même approche que la définition de value explicitement, mais tout cela dans les coulisses et a nommé des ensembles d'options à number_with_precision.

4

Vous pouvez utiliser les rails ActionView Numéro Helper number_with_precision:

number_with_precision(my_number, :precision => 2) 
+1

Cela ne m'aidera pas à bien afficher la valeur dans un champ de formulaire – nfm

+0

Il existe également une méthode "number_to_currency" –

+2

@nfm '<% = f.text_field: rate,: value => number_with_precision (f.object.rate)%> ' – meagar

Questions connexes