Format de devise

Cela devrait être un problème facile mais …

J’ai besoin de formater une devise pour l’affichage (chaîne) en C #

La devise en question aura ses propres règles telles que le symbole à utiliser et si ce symbole doit précéder la valeur (par exemple 10 $) ou après (par exemple 10 ₫ qui est le dong vietnamien).

Mais la manière dont les chiffres sont formatés dépend des utilisateurs locaux et non de la devise.

Par exemple

1.234,56 ₫ should be displayed to a user in Vietnam but 1,234.56 ₫ should be displayed to a user in the US 

(formaté en code si facile de voir la différence entre, et.)

Donc, code comme

 Double vietnamTotal = 1234.56; return vietnamTotal.ToSsortingng("c"); 

Ne fonctionnera pas car il utilisera le format et la devise des utilisateurs (ou plus précisément CultureInfo.CurrentCulture) pour obtenir des éléments comme 1 123,56 $ – bon usage de, et. mais faux symbole.

 Double vietnamTotal = 1234.56; CultureInfo ci = new CultureInfo(1066); // Vietnam return vietnameTotal.ToSsortingng("c",ci)); 

Donnerait 1.234,56 ₫ – Symbole correct, mauvaise utilisation de, et. pour l’utilisateur actuel.

Cet article donne plus de détails sur la bonne chose à faire, mais pas sur la façon de le faire.

Quelle méthode évidente cachée dans le cadre me manque?

  • Prenez NumberFormatInfo la NumberFormatInfo de l’utilisateur et NumberFormatInfo le.
  • Définissez le CurrencySymbol dans le format cloné sur le CurrencySymbol de la devise en question.
  • Si vous souhaitez que la position de la devise (et certains autres aspects du format) soit copiée, définissez CurrencyPositivePattern et CurrencyNegativePattern de la même manière.
  • Utilisez le résultat pour formater.

Par exemple:

 using System; using System.Globalization; class Test { static void Main() { decimal total = 1234.56m; CultureInfo vietnam = new CultureInfo(1066); CultureInfo usa = new CultureInfo("en-US"); NumberFormatInfo nfi = usa.NumberFormat; nfi = (NumberFormatInfo) nfi.Clone(); NumberFormatInfo vnfi = vietnam.NumberFormat; nfi.CurrencySymbol = vnfi.CurrencySymbol; nfi.CurrencyNegativePattern = vnfi.CurrencyNegativePattern; nfi.CurrencyPositivePattern = vnfi.CurrencyPositivePattern; Console.WriteLine(total.ToSsortingng("c", nfi)); } } 

Certes, ma console n’arrive pas à afficher le bon symbole, mais je suis sûr que cela est dû à des problèmes de fonts 🙂

Désolé, je suis peut-être un peu lent ici, mais je ne vois toujours pas ce que vous voulez dire. Il me semble que la question initiale est “J’ai une valeur dong qui, au Vietnam, je veux être affichée au format monétaire vietnamien, avec le symbole” “, et aux États-Unis, je veux être affichée au format monétaire, mais toujours avec un “”. “ .

Je suppose que les deux déclarations contradictoires me troublent … “La devise en question aura ses propres règles” et “la manière dont les chiffres sont formatés dépend de l’utilisateur local [sic], pas de la devise.”

Si tout ce que vous vouliez changer était le symbole monétaire et laissez la mise en forme conformément à la culture actuelle, le clonage du nfi et la définition du symbole ne suffisent-ils pas?

  NumberFormatInfo nfi; // pretend we're in Vietnam Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("vi-VN"); nfi = CultureInfo.CurrentCulture.NumberFormat.Clone() as NumberFormatInfo; nfi.CurrencySymbol = "₫"; Ssortingng s1 = (1234.5678).ToSsortingng("c", nfi); // pretend we're in America Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US"); nfi = CultureInfo.CurrentCulture.NumberFormat.Clone() as NumberFormatInfo; nfi.CurrencySymbol = "₫"; Ssortingng s2 = (1234.5678).ToSsortingng("c", nfi); 

Pour travailler avec une zone de texte, essayez ce qui suit:

 textBox2.Text = "Rp" + (textBox1.Text = ssortingng.Format(System.Globalization.CultureInfo.GetCultureInfo("id-ID"), "{0:#,##0.00}", double.Parse(textBox1.Text)));