2017-07-26 3 views
5

J'essaie d'obtenir l'entrée de l'utilisateur, l'analyser, puis afficher avec String.Format(), formatant des milliers avec comas.C# Convertir chaîne en double/décimal et retour en chaîne, en gardant les zéros à la fin, en ajoutant des comas pour des milliers

So, if user provides 
1000 I will display 1,000 
1000.00 => 1,000.00 
1000.0 => 1,000.0 
1,000.5 => 1,000.5 

Fondamentalement, je veux garder toutes les décimales (y compris les zéros) qui ont été fournis et ajoutez simplement le formatage des milliers. Je essayé:

String.Format("{0:#,0.######}" , Decimal.Parse(input)); 
String.Format("{0:#,0.######}" , Double.Parse(input); 

Répondre

7

double.Parse(input) est un pas aller, comme double ne garde pas trace du nombre de décimales.

decimal.Parse(input).ToString() va montrer que decimal fait le suivi de cela. Malheureusement, decimal.Parse(input).ToString() utilise cette précision et n'utilise pas de séparateur de milliers, et decimal.Parse(input).ToString("N") ignore la précision, mais utilise un séparateur de milliers.

extraire manuellement la précision de la virgule décimale fonctionne bien, et qui vous permet de construire la chaîne de format correct:

static string InsertThousandsSeparator(string input) { 
    var dec = decimal.Parse(input); 
    var bits = decimal.GetBits(dec); 
    var prec = bits[3] >> 16 & 255; 
    return dec.ToString("N" + prec); 
} 

Ceci est basé sur the layout of decimal as described on MSDN:

Bits 16 à 23 doit contenir un exposant entre 0 et 28, ce qui indique la puissance de 10 pour diviser le nombre entier.

See it working on .NET Fiddle. (avec la permission de @Alisson)

+0

Voilà, tous les cas de test réussis (j'ai testé moi-même). Solution agréable et propre. – Alisson

+0

Excellent. Merci beaucoup. Je pensais que j'aurais besoin d'écrire du Regex, que j'aime vraiment éviter. – Razkar

-1

Si vous ne me dérange pas converti en 1000 1,000.00 puis suit est la meilleure car elle considère aussi les paramètres régionaux de l'utilisateur.

string output = String.Format("{0:n}", input); 

Si vous voulez 1000 converti en seulement 1000, vous pouvez utiliser les éléments suivants:

string output2 = String.Format("{0:#,##0.##}", input); 
+0

"Si cela ne vous dérange pas 1000 converti à 1,000.00" - Si cela ne vous dérange pas d'ignorer ce qu'il y a dans la question, toute réponse fonctionne, mais la question couvre spécifiquement cela. – hvd

+0

Ce n'est pas ce que l'OP a demandé. Ils veulent garder le même nombre de décimales. – Alisson

+0

D'accord, mauvaise réponse sans lire correctement la question. Ma faute. – Sach

0

Vous pouvez utiliser regex pour cela:

var input = "1000.50000"; 
var regex = new Regex("^(?<int>-?[\\d,]+)\\.(?<fract>\\d+)$"); 
var match = regex.Match(input); 
var integralPart = match.Groups["int"].Value.Replace(",", ""); 
var fractionalPart = match.Groups["fract"].Value; 
var result = $"{decimal.Parse(integralPart):n0}.{fractionalPart}"; 
0
 public string DoFormat(string num) 
    { 
     int pt = num.IndexOf("."); 
     if (pt > 0) 
     { 
      return string.Format("{0:#,##0}", num.Substring(0, pt)) + num.Substring(pt, num.Length - pt); 
     } 
     else 
     { 
      return string.Format("{0:#,##0}", num); 
     } 
    } 

Cette divise la chaîne à la virgule décimale et retourne tout ce qui est après le point décimal comme a été tapé en formats BUT la partie entière du nombre avec des virgules.