Дважды в строку - форматер пропустил? - PullRequest
0 голосов
/ 13 сентября 2010

Я должен преобразовать double в строку по следующим правилам:

  1. Если позиция десятичной точки равна -1 (или другому несуществующему значению, означающему «Авто»), дробная часть числа должна выводиться со всеми значащими цифрами (все нули в конце должны быть обрезаны). Если double является целым числом, его дробная часть не должна выводиться вообще. Например, цифры = -1: 1029.0 -> 1 029, 1029.123456789 -> 1 029.123456789.

  2. Если позиция десятичной точки равна или больше 0, дробная часть числа должна выводиться с заданным количеством цифр. Например, цифры = 2: 1029,0 -> 1 029,00, 1029,123456789 -> 1 029,12

  3. Преобразование должно зависеть от культуры (точка или запятая как десятичная точка, запятая или пробел как разделитель групп и т. Д.).

У меня есть код для задания:

var _Culture = CultureInfo.CreateSpecificCulture("en-US");
object sourceValue = 1029.0;//.123456789;

int digits = -1; // 2;

var formatter = "G";
if (digits != -1)
{
    _Culture.NumberFormat.NumberDecimalDigits = digits;
    formatter = "N";
}

var sourceValueAsFloat = (double)sourceValue;
var s = sourceValueAsFloat.ToString(formatter, _Culture);

Есть ли другой форматер (кроме "N" или "G"), который я могу использовать вместо этого? Или, может быть, я могу использовать «N» / «G» по-другому?

С уважением,

Ответы [ 2 ]

0 голосов
/ 13 сентября 2010
// preferably make allDigits a static field to avoid re-allocating on every call
string allDigits = "#,0." + new string('#', 350);

string output = sourceValue.ToString(
                    digits < 0 ? allDigits : "#,0." + new string('0', digits));

А если вам нужно явно обращаться с разными культурами:

string output = sourceValue.ToString(
                    digits < 0 ? allDigits : "#,0." + new string('0', digits),
                    culture);
0 голосов
/ 13 сентября 2010

См. здесь и здесь для всех спецификаторов строки формата, которые понимает .net.

...