J'ai une application qui gère les entrées de devises. Toutefois, si vous êtes aux États-Unis, vous pouvez entrer un numéro comme Y a-t-il un moyen facile, dans les rails, d'adapter l'entrée monétaire à une locale? P>
Notez que je ne cherche pas l'affichage de la devise (ALA 12,345.67 code>; En France, il pourrait être
12.345,67 code>. p>
Number_To_Currency CODE>), je cherche à gérer une personne qui tape dans une chaîne de devise et à la convertir en décimale. p>
5 Réponses :
TIM,
Vous pouvez essayer d'utiliser le Fonction 'Agrégation' , combiné avec une classe de délégation. Je ferais quelque chose comme: p> de cette manière, vous pourrez attribuer directement: p> ou < / p> L'avantage est que vous ne devez pas modifier rien em> sur des contrôleurs / vues. p> p> p>
Utilisation du Traductions des numéros Dans le document I18N intégré devrait vous permettre d'entrer vos prix en un format (1234.56), puis de les utiliser avec Bien sûr, vous devrez définir number_to_currency code> pour les afficher automatiquement dans les paramètres locaux corrects. P >
i18n.locale code> à l'aide d'un
avant_filter code>, consultez le Guide I18N , section 2.3. P>
Vous devez nettoyer l'entrée afin que les utilisateurs puissent taper à peu près tout ce qu'ils veulent, et vous obtiendrez quelque chose de cohérent pour stocker dans votre base de données. En supposant que votre modèle s'appelle "Doughenterry" et votre attribut est "Montant", et il est stocké comme un entier.
Voici une méthode convertit une entrée de chaîne en centimes (si la chaîne se termine par deux chiffres après un délimètre, il est supposé être centimes). Vous voudrez peut-être faire cela plus intelligent, mais voici le concept: p> puis écrase l'accessor "montant" par défaut, le transmettant à travers cette méthode: P> class DoughEntry << ActiveRecord::Base
def amount=(input)
write_attribute(:amount, convert_to_cents(input))
end
protected
def convert_to_cents(input)
if input =~ /^.*[\.,]\d{2}$/
input.gsub(/[^\d-]/,'').to_i
else
"#{input.gsub(/[^\d-]/,'')}00".to_i
end
end
end
Attention, ces gsubs déposeront le symbole moins, donc si vous avez des quantités négatives, vous vous retrouverez avec la valeur absolue.
Vous pouvez donner à cela une prise de vue: et les cas de test: p>
Nous avons écrit ceci:
class String def safe_parse self.gsub(I18n.t("number.currency.format.unit"), '').gsub(I18n.t("number.currency.format.delimiter"), '').gsub(I18n.t("number.currency.format.separator"), '.').to_f end end
Entrez-vous souvent les scores séparez-vous lorsque vous tapez un numéro ?? Personnellement jamais jamais.
Je ne le fais pas, mais je ne peux pas garantir que personne ne le fera. Je préfère parler du côté de l'utilisateur-bonheur plutôt que de la frustration. De plus, si vous copiez des valeurs, dites, votre relevé bancaire en ligne, il peut déjà être formaté de $ et, et. et toutes sortes d'autres personnages.