2008-11-17 4 views
15

Je voudrais regrouper les chiffres dans un double par milliers, mais aussi la sortie, mais le nombre de décimales est réellement dans le nombre. Je ne peux pas comprendre la chaîne de format.Mettre en forme un nombre avec des virgules, mais conserver des décimales

1000 => 1,000 
100000 => 100,000 
123.456 => 123.456 
100000.21 => 100,000.21 
100200.123456 => 100,200.123456 

Avertissements (ce n'est pas aussi simple que vous pensez):

  • S'il vous plaît ne me point pas this question il ne répond pas à ma question
  • S'il vous plaît ne me pointez pas MSDN, les articles ne m'ont pas aidé. (Si vous croyez que je les lire correctement, lisez-vous et poster la bonne réponse)
  • .ToString("n") ne fonctionne pas, il arrondit les chiffres

Répondre

10

Cela semble faire exactement ce que vous voulez:

public void Code(params string[] args) 
{ 
    Print(1000); 
    Print(100000); 
    Print(123.456); 
    Print(100000.21); 
    Print(100200.123456); 
} 

void Print(double n) 
{ 
    Console.WriteLine("{0:###,###.#######}", n); 
} 

1,000 
100,000 
123.456 
100,000.21 
100,200.123456 
+0

Si vous avez plus de 7 décimales, cela ne le tronquera-t-il pas? – MusiGenesis

+0

Il semble que ce soit loin d'être idéal, mais je peux le pousser à 12 décimales, ce qui devrait être une limite pour mes objectifs. –

+1

Ne fonctionnera pas pour un nombre arbitraire de décimales, cependant. Puisque le double a une précision de 15-16 chiffres, bien que "{0: ##, ###, ###, ###, ###, ## 0. ############ ###} "semblerait capturer tous les doubles possibles avec tous les chiffres possibles. Remarquez que je préfère un 0 leader. – tvanfosson

0

Essayez celui-ci:

VB:

Dim vals() As Double = {1000, 100000, 123.456, 100000.21, 100200.123456} 
For Each val As Double in vals 
    Console.WriteLine(val.ToString("###,###.#########")) 
Next val 

C#:

double[] vals = new double[] {1000, 100000, 123.456, 100000.21, 100200.123456}; 
foreach (double val in vals) 
{ 
    Console.WriteLine(val.ToString("###,###.#########")); 
} 

T Le problème est qu'il n'y a pas de format pour gérer un nombre arbitraire de décimales. Cependant, étant donné que vous ne pouvez stocker qu'une précision très limitée, vous pouvez simplement l'utiliser et ajouter quelques caractères supplémentaires pour le couvrir, en supposant que vous êtes prêt à le laisser couper tous les 0 insignifiants.

Et le lien MSDN que vous avez posté est l'endroit exact où vous alliez pour lire comment faire.

1

Essayez simplement utiliser « #, # », cela ajoute les virgules pour des milliers et al, mais je ne sais pas si elle gardera les décimales , sinon "#, ###. ####################", ou tout nombre de symboles '#' que vous voulez après la virgule.

0

Cela pourrait être un peu lent, mais il va faire ce que vous vouloir.

public static string FormatNumber(double num) 
{ 
    string s = num.ToString(); 
    string result = ""; 

    if(s.IndexOf('.') != -1) 
    { 
     result = s.Substring(s.IndexOf('.')); 
     s = s.Substring(0, s.IndexOf('.')); 
    } 

    while (s.Length > 3) 
    { 
     result = "," + s.Substring(s.Length - 3); 
     s = s.Substring(0, s.Length - 3); 
    } 
    if (s.Length == 0) 
     return result.Substring(1); 
    return s + result; 
} 
+1

Downvoting est un peu dur pour quelque chose qui répond à la question non? Bien que ce ne soit pas la meilleure solution, c'est une solution. – LeppyR64

2

Un ancien thread, mais aucune des réponses ne me semble entièrement satisfaisante. La plupart d'entre eux tournent zéro dans la chaîne vide, y compris celle avec le plus upvotes.

Je pense qu'une meilleure solution est "#,##0.#################", qui affiche au moins des zéros. C'est toujours moche quand même. Il doit y avoir un meilleur moyen.

double[] vals = new double[] { 0.0, 0.1234, -0.1234, 1.0, 
           123456789.123456, 123456789.0, 
           0.123456789123456 }; 
foreach (double val in vals) 
{ 
    Console.WriteLine(val + ": " + val.ToString("#,##0.#################")); 
} 
Questions connexes