.NET String.Format () pour ajouter des virgules en milliers pour un nombre

852

Je veux ajouter une virgule à la place des milliers pour un nombre.

String.Format()?

Seibar
la source

Réponses:

1216
String.Format("{0:n}", 1234);  // Output: 1,234.00
String.Format("{0:n0}", 9876); // No digits after the decimal point. Output: 9,876
Seibar
la source
39
String.Format("{0:#,##0}", 1234);fonctionne également sans décimales.
Greg Bray
9
Comment puis-je répliquer le spécificateur "N" mais avec autant de chiffres décimaux que présents dans le nombre?
Stephen Drew
56
@Justin: Selon msdn.microsoft.com/en-us/library/0c899ak8.aspx , le ',' (et le '.') Sont remplacés par les caractères localisés corrects.
Roger Lipscombe
@RogerLipscombe Je ne l'avais pas réalisé
Justin
6
@VVVV - alors vous passez probablement une chaîne au lieu d'un nombre . Si vous avez une chaîne, vous devez d'abord la convertir en float ou en double. Trystring.Format("{0:n0}", Double.Parse(yourValue));
ToolmakerSteve
379

J'ai trouvé que c'était le moyen le plus simple:

myInteger.ToString("N0")
alchimique
la source
1
Vous pouvez également l'utiliser avec string.Format, comme dans string.Format ("Voici un certain nombre avec des virgules, et sans décimales, {0: N0}", 123456789 (;
Dan Morphis
16
ne devrait-il pas être myInteger.ToString ("N0") ... string.tostring je ne pense pas que cela fonctionnerait.
Taylor Brown
1
Je sais que ça fait 5 ans maintenant, mais merci! Cela fonctionne pour les nombres> 4 caractères et <4 caractères.
AskYous
@AskYous - Eh bien, cela fonctionne également pour 4 caractères .. Autant dire que cela fonctionne pour n'importe quelle longueur.
Broots Waymb
Cela fonctionne, mais il change sur les paramètres régionaux
saulyasar
149
int number = 1000000000;
string whatYouWant = number.ToString("#,##0");
//You get: 1,000,000,000
p.campbell
la source
27
Cette solution n'est pas bonne du point de vue de l'internationalisation - d'autres cultures utilisent des caractères autres que ,comme séparateur de milliers, par exemple un espace ou même ..
Justin
6
Fonctionne merci + 1. Ont étendu donc affiche jusqu'à 2 dp number.ToString ("#, ## 0. ##")
Crab Bucket
8
@MacSigler Ce n'est en fait pas vrai, voir le commentaire de Roger Lipscombe sur la réponse ci-dessus: String.Format appliquera automatiquement la localisation.
Dan Bechard
10
@MacSigler C'est la chose cependant, ce code n'imprime pas toujours une virgule. Uniquement lorsque la culture est celle qui attend des virgules (par exemple en-US ou invariant). Si la culture est celle qui attend un autre séparateur (par exemple .), .NET remplacera automatiquement la virgule par ce séparateur. Encore une fois, je vous invite à lire le lien publié par Roger si vous ne comprenez toujours pas pourquoi.
Dan Bechard
4
Le commentaire de @MacSigler Justin est toujours correct en ce que si vous ne forcez pas explicitement la culture à en-US, il héritera des paramètres de culture de la machine locale. Ma compréhension est que la compilation du code ci-dessus, puis son exécution sur deux machines avec des cultures différentes (avec des séparateurs de nombres différents) produiraient des résultats différents. Si vous voulez qu'il produise toujours une virgule, vous devez définir explicitement une culture qui utilise la virgule (par exemple invariante).
Dan Bechard
98

Si vous voulez une culture spécifique, vous pouvez essayer ceci:

(19950000.0).ToString("N",new CultureInfo("en-US")) = 19 950 000,00

(19950000.0).ToString("N",new CultureInfo("is-IS")) = 19.950.000,00

Remarque: Certaines cultures ,signifient décimales plutôt que d' .être prudent.

prabir
la source
77

Formats standard, avec leurs sorties associées,

Console.WriteLine("Standard Numeric Format Specifiers");
String s = String.Format("(C) Currency: . . . . . . . . {0:C}\n" +
                    "(D) Decimal:. . . . . . . . . {0:D}\n" +
                    "(E) Scientific: . . . . . . . {1:E}\n" +
                    "(F) Fixed point:. . . . . . . {1:F}\n" +
                    "(G) General:. . . . . . . . . {0:G}\n" +
                    "    (default):. . . . . . . . {0} (default = 'G')\n" +
                    "(N) Number: . . . . . . . . . {0:N}\n" +
                    "(P) Percent:. . . . . . . . . {1:P}\n" +
                    "(R) Round-trip: . . . . . . . {1:R}\n" +
                    "(X) Hexadecimal:. . . . . . . {0:X}\n",
                    - 1234, -1234.565F);
Console.WriteLine(s);

Exemple de sortie (culture en-us):

(C) Currency: . . . . . . . . ($1,234.00)
(D) Decimal:. . . . . . . . . -1234
(E) Scientific: . . . . . . . -1.234565E+003
(F) Fixed point:. . . . . . . -1234.57
(G) General:. . . . . . . . . -1234
    (default):. . . . . . . . -1234 (default = 'G')
(N) Number: . . . . . . . . . -1,234.00
(P) Percent:. . . . . . . . . -123,456.50 %
(R) Round-trip: . . . . . . . -1234.565
(X) Hexadecimal:. . . . . . . FFFFFB2E
CoderTao
la source
2
Cette réponse contient de nombreuses informations utiles. En apprenant par l'exemple, je vois maintenant ce que signifient 0 et 1 dans le format de chaîne.
user420667
41

C'est le meilleur format. Fonctionne dans tous ces cas:

String.Format( "{0:#,##0.##}", 0 ); // 0
String.Format( "{0:#,##0.##}", 0.5 ); // 0.5 - some of the formats above fail here. 
String.Format( "{0:#,##0.##}", 12314 ); // 12,314
String.Format( "{0:#,##0.##}", 12314.23123 ); // 12,314.23
String.Format( "{0:#,##0.##}", 12314.2 ); // 12,314.2
String.Format( "{0:#,##0.##}", 1231412314.2 ); // 1,231,412,314.2
Dennis
la source
1
Et si je veux des points comme séparateur de milliers et une virgule comme délimiteur décimal?
FrenkyB
a voté parce qu'il n'affiche pas 12 314,0 (comme le format n1) mais 12 314 :)
NDUF
34
String.Format("{0:#,###,###.##}", MyNumber)

Cela vous donnera des virgules aux points pertinents.

Stephen Wrighton
la source
10
La méthode ": n" est meilleure car elle doit respecter les paramètres régionaux de l'utilisateur.
Torlack le
12
C'est vrai, mais il n'est pas garanti de vous donner des virgules au millier de points car il respecte les paramètres régionaux de l'utilisateur.
Stephen Wrighton,
2
tout de suite: c'est vrai, mais il n'est pas garanti de respecter les paramètres régionaux de l'utilisateur car il utilise des virgules comme séparateur de milliers. (Par exemple, au Portugal, la virgule est plutôt le séparateur décimal.)
ANeves
1
Si vous souhaitez appliquer des valeurs après le. vous devez remplacer le # par un 0. msdn.microsoft.com/en-us/library/0c899ak8(v=vs.110).aspx : zéro remplace le zéro par le chiffre correspondant s'il y en a un; sinon, zéro apparaît dans la chaîne de résultat tandis que le symbole "#" est remplacé par le chiffre correspondant s'il y en a un; sinon, aucun chiffre n'apparaît dans la chaîne de résultat.
Clarice Bouwer
cette méthode fonctionnait bien pour mes besoins, la page msdn sur la méthode Int32.ToString qui serait un endroit principal, elle serait utilisée msdn.microsoft.com/en-us/library/8wch342y.aspx n'est pas très utile pour ce particulier application soit
stackuser83
33

La réponse la plus votée était excellente et utile depuis environ 7 ans. Avec l'introduction de C # 6.0 et plus précisément de l'interpolation de chaînes, il existe un moyen plus net et, plus sûr, de faire ce qui a été demandé to add commas in thousands place for a number:

var i = 5222000;
var s = $"{i:n} is the number"; // results to > 5,222,000.00 is the number
s = $"{i:n0} has no decimal"; // results to > 5,222,000 has no decimal

Où la variable i est mise en place de l'espace réservé (ie {0}). Il n'est donc pas nécessaire de se rappeler quel objet va dans quelle position. Le formatage (ie :n) n'a pas changé. Pour une fonctionnalité complète des nouveautés, vous pouvez aller sur cette page .

von v.
la source
29

aussi simple que cela:

float num = 23658; // for example 
num = num.ToString("N0"); // Returns 23,658

plus d'informations sont ici

a_m_dev
la source
21

Si vous souhaitez forcer un séparateur "," quelle que soit la culture (par exemple dans un message de trace ou de journal), le code suivant fonctionnera et aura l'avantage supplémentaire de dire au gars suivant qui tombe dessus exactement ce que vous faites.

int integerValue = 19400320; 
string formatted = string.Format(CultureInfo.InvariantCulture, "{0:N0}", integerValue);

ensembles formatés à "19 400 320"

Ravi Desai
la source
21

L'exemple suivant affiche plusieurs valeurs mises en forme à l'aide de chaînes de format personnalisé qui incluent zéro espace réservé.

String.Format("{0:N1}", 29255.0);

Ou

29255.0.ToString("N1")

résultat "29 255,0"

String.Format("{0:N2}", 29255.0);

Ou

29255.0.ToString("N2")

résultat "29 255,00"

Yitzhak Weinberg
la source
belle réponse mais qu'en est-il de 29.255,00?
Roxy'Pro
@ Roxy'Pro Changer le lieu / la culture?
Maarten Bodewes
@MaartenBodewes Je pensais qu'il y avait une lettre correspondante comme "N1", "F1" ou smth comme ça =) Mais chanter la culture fonctionnerait définitivement ..
Roxy'Pro
11
int num = 98765432;
Console.WriteLine(string.Format("{0:#,#}", num));
p.campbell
la source
3
Ou Console.WriteLine ("{0: #, #}", num); si vous voulez juste l'imprimer. Mais string.Format (...) est plus utile je suppose.
Indy9000
11

Plus simple, en utilisant l'interpolation de chaînes au lieu de String.Format

 $"{12456:n0}"; // 12,456
 $"{12456:n2}"; // 12,456.00

ou en utilisant votreVariable

 double yourVariable = 12456.0;
 $"{yourVariable:n0}"; 
 $"{yourVariable:n2}"; 
brakeroo
la source
9

Par exemple, String.Format("{0:0,0}", 1);renvoie 01, pour moi n'est pas valide

Ça marche pour moi

19950000.ToString("#,#", CultureInfo.InvariantCulture));

sortie 19,950,000

cmujica
la source
8

Notez que la valeur que vous formatez doit être numérique. Il ne semble pas qu'il faudra une représentation sous forme de chaîne d'un nombre et le format est avec des virgules.


la source
5
String.Format("0,###.###"); also works with decimal places
Abolfazl Rastgou
la source
5

C # 7.1 (peut-être plus tôt?) Rend cela aussi simple et agréable qu'il devrait l'être, avec une interpolation de chaîne:

var jackpot = 1000000;
var niceNumberString = $"Jackpot is {jackpot:n}";
var niceMoneyString = $"Jackpot is {jackpot:C}";
Mark Zhukovsky
la source
3

Vous pouvez utiliser une fonction comme celle-ci pour formater les nombres et éventuellement passer les décimales souhaitées. Si aucune décimale n'est spécifiée, elle utilise deux décimales.

    public static string formatNumber(decimal valueIn=0, int decimalPlaces=2)
    {
        return string.Format("{0:n" + decimalPlaces.ToString() + "}", valueIn);
    }

J'utilise décimal mais vous pouvez changer le type en n'importe quel autre ou utiliser un objet anonyme. Vous pouvez également ajouter une vérification d'erreur pour les valeurs de décimales négatives.

Dunwan
la source
-2

La méthode que j'ai utilisée pour ne plus me soucier des cultures et des problèmes de formatage potentiels est que je l'ai formatée en devise et j'ai ensuite retiré le symbole monétaire.

if (decimal.TryParse(tblCell, out result))

{
  formattedValue = result.ToString("C").Substring(1);
}
8 John Volante
la source
6
Ce code n'est pas indépendant de la culture - il utilisera la culture par défaut définie sur la machine exécutant le code. Cela pourrait créer une sortie indésirable où cette culture place ses symboles monétaires à la fin du nombre plutôt qu'au début (par exemple fr-FR), ou utilise plusieurs caractères pour désigner la devise (par exemple da-DK), ou ne sépare pas des milliers de virgules (par exemple, la plupart des de l'Europe continentale).
rendu le
-2

Voici une bonne solution en Java!

NumberFormat fmt = NumberFormat.getCurrencyInstance();
System.out.println(fmt.format(n));

ou pour un moyen plus robuste, vous pouvez obtenir les paramètres régionaux d'un lieu particulier, puis utilisez comme ci-dessous:

int n=9999999;
Locale locale = new Locale("en", "US");
NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);
System.out.println(fmt.format(n));

US Locale OUTPUT: 9 999 999,00 $

Sortie locale allemande

Locale locale = new Locale("de", "DE");

SORTIE: 9.999.999,00 €

Sortie locale indienne

Locale locale = new Locale("de", "DE");

SORTIE: Rs.9,999,999.00

Sortie en langue locale estonienne

Locale locale = new Locale("et", "EE");

SORTIE: 9999 999 €

Comme vous pouvez le voir dans différentes sorties, vous n'avez pas à vous soucier du séparateur qui est une virgule ou un point ou même un espace, vous pouvez obtenir le nombre formaté selon les normes i18n

Anirudh
la source
1
où avez-vous utilisé la variable locale ??
Smith
bien correctement repéré, est-il en fait à utiliser lors de l'obtention de l'instance de devise comme: NumberFormat fmt = NumberFormat.getCurrencyInstance (locale); corrigé le code, merci!
Anirudh
3
Avez-vous vérifié les balises? La question concerne C # et non Java!
Salar
-3

Si vous souhaitez l'afficher dans DataGridview, vous devez modifier son type, car la valeur par défaut est String et puisque vous le modifiez en décimal, il le considère comme un nombre avec virgule flottante.

Dim dt As DataTable = New DataTable
dt.Columns.Add("col1", GetType(Decimal))
dt.Rows.Add(1)
dt.Rows.Add(10)
dt.Rows.Add(2)

DataGridView1.DataSource = dt
Ali
la source