2009-06-01 9 views
2

Je suis en train de convertir des nombres sous la forme 123456 en 123456 que je trouve assez facile en utilisant la méthode .NET ToString() avec un format personnalisé de N0.Bizarrerie avec ToString() mise en forme du nombre personnalisé

Cependant, dans un cas de données, je reçois des formats étranges en utilisant cette méthode.

Dans ce cas, je génère dynamiquement un DataTable pour que ma table d'entrée teste le code.

DataTable dt = new DataTable(); 

dt.Columns.Add("Cases", typeof(Int32)); 

Par exemple mes données ressemblent à ceci avant que le formatage ne soit appliqué.

-------------------------------------------- 
| Cases | 2495 | 3937 | 3207 | 4173 | 4265 | 
--------------------------------------------

Je voudrais que ça ressemble à ceci.

------------------------------------------------- 
| Cases | 2,495 | 3,937 | 3,207 | 4,173 | 4,265 | 
-------------------------------------------------

J'essaye de le formater en utilisant du code comme ça.

output.Rows[r][c] = Convert.ToInt32(input.Rows[c - 1][r + 1]).ToString("N0"); 

(Note: La raison de la mise en forme étrange est parce que je prends un DataTable et transposer à un autre DataTable.)

En utilisant le formatage ci-dessus, je reçois les données suivantes retourné maintenant.

-------------------------------------------------------------------------- 
| Cases | 01/02/0495 | 01/03/0937 | 01/03/0207 | 01/04/0173 | 01/04/0265 | 
--------------------------------------------------------------------------

J'ai ensuite essayé avec un point décimal en utilisant:

output.Rows[r][c] = Convert.ToInt32(input.Rows[c - 1][r + 1]).ToString("N01"); 

Ce qui m'a donné le résultat suivant. Cela m'a à présent rendu confus car il accepte le fait que le nombre peut être formaté de cette façon. La prochaine chose que j'ai essayé était différentes façons de formater les chaînes comme ça.

output.Rows[r][c] = string.Format("{0:N0}", input.Rows[c - 1][r + 1]); 
output.Rows[r][c] = Convert.ToInt32(input.Rows[c - 1][r + 1]).ToString("#,##0"); 

Aucun de ceux-ci donnent le format numérique que je voudrais soit. Quelqu'un peut-il conseiller où je vais mal? Est-ce si simple que j'ai manqué le point?

Répondre

1

Il me semble simplement que vous avez mal défini le type de données des colonnes dans le DataTable. Essayez de le rendre explicite en tant que int (il ressemble à DateTime pour le moment).

En outre - le travail du DataTable est à maintenez data; ne pas le disply. Vous pouvez le stocker pré-formaté comme string s, je suppose (tant que vous dites que les colonnes sont des chaînes) - mais si vous le stockez comme int, puis oubliez l'affichage; dès que vous avez exécuté Convert.ToInt32 votre travail est terminé. Comment il apparaît est le travail de DataGridView (ou autre); dire que à propos de "N0" ...

+0

Malheureusement, ce n'est pas le cas dans cet exemple car je génère un DataTable en entrée comme exemple pour tester le code.Le champ dans ce cas est défini par dt.Columns.Add ("Cases", typeof (Int32)); que je vais mettre à jour ma question avec. –

+0

Est-ce le cas? Je ne suis pas en mesure de contenir des données formatées dans un DataTable? Si tel est le cas, pourquoi ai-je pu le faire pour d'autres DataTables? Ce que je fais pour prendre des données non formatées, le formater puis le transposer dans un nouveau DataTable. C'est le premier exemple qui n'a pas fonctionné pour moi. –

+0

Fin - mais si vous souhaitez conserver des données formatées, assurez-vous de lui indiquer que les colonnes sont des chaînes. Sinon, il pourrait faire des suppositions (incorrectes) ... –

0

Essayez d'utiliser simplement "N" comme dans ToString ("N");

+0

Cela fonctionne mais ne me donne pas le nombre formaté à zéro décimales. –

+0

Si votre DataTable ne contient que des entiers, comment se fait-il qu'il y ait des décimales? –

+0

@Jon Parce que lorsque vous utilisez "N", il regarde la propriété NumberFormatInfo.NumberDecimalSeparator qui prend la valeur du panneau de configuration régionale et les paramètres de langue de l'ordinateur et dans mon cas, il doit être deux décimales. –