2009-06-01 4 views
2

Я пытаюсь преобразовать числа в форме 123456 в 123,456, которые я нахожу достаточно легко, используя метод .NET ToString() с пользовательским форматом N0.Oddity with ToString() форматирование пользовательского номера

Однако в одном случае данных я получаю странные форматы при использовании этого метода.

В этом случае я динамически генерирую DataTable для таблицы ввода для проверки кода.

DataTable dt = new DataTable(); 

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

Например, мои данные выглядят так, как только применяется форматирование.

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

Хотелось бы, чтобы это выглядело так.

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

Я пытаюсь форматировать его, используя код, подобный этому.

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

(Примечание: Причина странного форматирования, потому что я беру DataTable и перенося его к другому DataTable.)

Используя выше форматирование я теперь получить следующие данные возвращены.

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

Затем я попробовал это один десятичную точку с помощью:

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

Который дал мне следующий результат.

------------------------------------------------------ 
| Cases | 2495.0 | 3937.0 | 3207.0 | 4173.0 | 4265.0 | 
------------------------------------------------------

Это уже путало меня, потому что оно принимает факт, что число может быть отформатировано таким образом.

Следующее, что я пробовал, это разные способы форматирования строк так.

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"); 

Ни один из них не дает формат номера, как бы я хотел. Может ли кто-нибудь посоветовать, где я ошибаюсь? Это так просто, что я пропустил это?

ответ

1

Непонятно, что вы неправильно задали тип данных столбцов в DataTable. Попробуйте сделать его явным как int (он выглядит как DateTime на данный момент).

Также - работа DataTable - провести данные; не делать этого. Вы можете сохранить его в предварительно отформатированном виде как string s, я думаю (до тех пор, пока вы скажите, что столбцы являются строками), - но если вы храните его как int, забудьте о нем; как только вы запустите Convert.ToInt32, ваша работа окончена. Как это выглядит, работа DataGridView (или что-то еще); скажите что о «N0» ...

+0

К сожалению, это не так в этом примере, потому что я генерирую входной DataTable в качестве примера для проверки кода.Поле в этом случае определяется dt.Columns.Add («Случаи», typeof (Int32)); с которым я буду обновлять свой вопрос. –

+0

Это тот случай? Я не могу хранить форматированные данные в DataTable? Если это так, то почему я смог сделать это для других DataTables? Что я делаю, чтобы принимать неформатированные данные, форматируя их, а затем перенося на новый DataTable. Это первый пример, который не сработал для меня. –

+0

Хорошо, но если вы хотите сохранить форматированные данные, обязательно сообщите ему, что столбцы являются строками. В противном случае это может сделать (неверные) предположения ... –

0

Попробуйте использовать просто «N», как в ToString («N»);

+0

Это работает, но не дает отформатированного числа до нуля десятичных знаков. –

+0

Если ваш DataTable просто содержит целые числа, как в любом случае есть десятичные места? –

+0

@Jon Потому что, когда вы используете «N», он смотрит на свойство NumberFormatInfo.NumberDecimalSeparator, которое берет значение из региональных и языковых настроек панели управления на компьютере, и в моем случае это должно быть два десятичных знака. –