2012-06-14 4 views
13

Я хотел бы преобразовать десятичную строку в строку с запятыми в качестве тысяч разделителей и сохранить ту же точность, с которой была создана десятичная запятая. (Будет иметь 2-5 значащих цифр)Формат десятичного числа с запятыми, сохранение конечных нулей

 decimal d = 1234.4500M; 

     //I'd like "1,234.4500" 

     var notRight = d.ToString("###,###.#######");  //1,234.45 
     var alsoNotRight = d.ToString("###,###.00000");; //1,234.45000 
     var notRightEither = d.ToString("N"); //1,234.45 
     var notRightEither2 = d.ToString("G"); //1234.45000 

Нет ли встроенный способ сделать это без разбора строки вручную? Если нет ни одной строкой формата, что это самый простой способ сделать это?

+0

Я решил изучить, как выполняется форматирование. К сожалению, тяжелая работа не управляется кодом (неудивительным), смотрящим на [Стандартная строка числового формата] (http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx#GFormatString), она выглядит только как «G» «' (по умолчанию) сохраняет пробелы. – Guvante

ответ

12

В соответствии с documentation десятичное число сохраняет конечные нули. Вы можете отобразить их, если вы используете спецификатор «G» или вообще не спецификатор. Они теряются, когда вы используете один из спецификаторов, который включает в себя тысячу разделителей.

Если вы хотите, чтобы указать количество конечных нулей при преобразовании в строку, вы можете сделать это путем добавления a precision specifier (от 0 до 99 цифр) после символа формата, например:

decimal d=1234.45M; 
var numberAsString=d.ToString("N4"); 

Результат будет быть

1,234.4500 

UPDATE: Вы можете получить количество десятичных цифр, используя Decimal.GetBits метод, который возвращает двоичное представление числа. Количество десятичных знаков сохраняется в битах 16-23 (третий байт) четвертого элемента.

The fourth element of the returned array contains the scale factor and sign. It consists of the following parts:

...

Bits 16 to 23 must contain an exponent between 0 and 28, which indicates the power of 10 to divide the integer number.

Начало строковое представление с использованием всех цифр можно сделать так:

decimal d=1234.45000M; 
var nums=Decimal.GetBits(d); 
var decimals=BitConverter.GetBytes(nums[3])[2]; 
var formatStr="N"+decimals; 
d.ToString(formatStr); 

, который будет производить

1,234.45000 
+0

Вы частично ошибочны. Хотя отладчик покажет, что значение десятичной величины равно 1234,45, конечные 0 сохраняются. Попробуйте следующий код, например: 'decimal d = 1234.4500M;' 'Console.WriteLine (d); // выводит 1234.4500'. –

+1

Ваш ответ охватывает только пример, где число имеет ровно 4 десятичных знака. Я считаю, что он пытается сохранить исходное число десятичных знаков (2-5). –

+1

Формат указан как число, деленное на мощность 10. По этой причине он может хранить 12345/100 или 1234500/10000 отчетливо. – Guvante

1

Поскольку вы планируете иметь переменное количество знаков после запятой (2-5), я не думаю, что вы можете вытащить его через строковый формат.

Это решение не обязательно красиво, но оно выполняет свою работу. Обратите внимание, что он выделит несколько строк в этом процессе (я считаю, 5), поэтому он может плохо работать при широкомасштабном использовании. Вы сохраните количество знаков после запятой и получите разделенные запятыми группы в части до десятичной.

public static string FormatDecimal(decimal d) 
{ 
    return d.ToString("N0") + // Format portion before decimal 
      "." + 
      d.ToString().Split('.')[1]; // Retain number of decimal places 
} 
+0

Вы можете извлечь количество цифр из двоичного представления десятичной дроби и построить строку формата с правильным количеством цифр –

+0

Вы также используете разделители, специфичные для культуры, что означает, что ваш код сломается, если он используется в культуре, , «для десятизначных чисел, таких как Франция, Германия, Испания, Италия, Греция, Южная Африка –

+0

Мне это нравится - его достаточно легко понять код с первого взгляда. Хотя вы можете получить индекс за пределами, если значение не имеет десятичной составляющей (например, 5M) – foson

Смежные вопросы