10
votes

Manipulation des intrants internationaux en rubis sur rails

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 12,345.67 ; En France, il pourrait être 12.345,67 .

Y a-t-il un moyen facile, dans les rails, d'adapter l'entrée monétaire à une locale?

Notez que je ne cherche pas l'affichage de la devise (ALA Number_To_Currency ), je cherche à gérer une personne qui tape dans une chaîne de devise et à la convertir en décimale.


2 commentaires

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.


5 Réponses :


2
votes

TIM,

Vous pouvez essayer d'utiliser le Fonction 'Agrégation' , combiné avec une classe de délégation. Je ferais quelque chose comme: xxx

de cette manière, vous pourrez attribuer directement: xxx

ou < / p> xxx

L'avantage est que vous ne devez pas modifier rien sur des contrôleurs / vues.


0 commentaires

2
votes

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 number_to_currency pour les afficher automatiquement dans les paramètres locaux corrects.

Bien sûr, vous devrez définir i18n.locale à l'aide d'un avant_filter , consultez le Guide I18N , section 2.3.


0 commentaires

4
votes

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> xxx pré>

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


1 commentaires

Attention, ces gsubs déposeront le symbole moins, donc si vous avez des quantités négatives, vous vous retrouverez avec la valeur absolue.



11
votes

Vous pouvez donner à cela une prise de vue: xxx

et les cas de test: xxx


0 commentaires

5
votes

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


0 commentaires