C # форматирование числа с тысячами разделителей, но с сохранением количества десятичных разрядов как есть

#c# #number-formatting

#c# #форматирование чисел

Вопрос:

Я хочу добавить разделитель тысяч к double числу, но хочу сохранить десятичные разряды как есть, т.Е. Не хочу никакого округления.

#,# решает ли моя проблема добавления разделителя в тысячу, но как мне сохранить десятичные разряды? #,# удаляет часть после . .

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

Я проверял другие сообщения и даже документы, но почему-то не смог понять это.

 string strFormat = "#,#";
string str = double.parse("912123456.1123465789").ToString(strFormat);
 //Expected here 912,123,456.1123465789 
//Actual Output 912,123,456

//912123456.123 should give 912,123,456.123
//912123456.1 should give 912,123,456.1
//912123456.1123465789 should give 912,123,456.1123465789
//912123456 should give 912,123,456
 

Комментарии:

1. Каждому было бы легко что-то предложить, если бы вы опубликовали то, что «на самом деле» назначено. Видели ли вы какие-либо проблемы с округлением?

2. @Thangadurai обновил вопрос фактическим результатом.

3. Как насчет "#,##0.#" ? tutorialspanel.com/string-format-in-csharp-for-decimal /…

4. Кроме того, существуют ли отрицательные числа?

5. Вы пробовали #,##0.########## ? Кажется грязным вариантом, но если он работает в то же время…

Ответ №1:

Что ж, после просмотра документации по Microsoft может показаться, что нет особого способа разрешить позицию с плавающей запятой в числе — все символы в строке формата являются символьными заполнителями.

Я бы рекомендовал вам либо использовать очень неприятное заранее определенное число # s для установки ширины десятичной позиции, либо немного меньшую (или, возможно, большую, в зависимости от вашего мировоззрения) неприятную опцию чтения всех чисел в массив, определения самой длинной десятичной позиции, а затем построения формата # s с использованиемрезультат.

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

Кроме того, это одна из тех вещей, когда вы можете поместить строку в параметр конфигурации и изменять ее по мере необходимости — гораздо более гибко.

Честно говоря, это очень незначительная вещь, о которой нужно беспокоиться в общей схеме производительности и написания программы.

Технически, Udi Y получает мой голос!

Комментарии:

1. Речь идет не о производительности, а об удовлетворенности пользователей и о том, чтобы все работало в определенном поле, которое является очень строгим.

2. @AbdulRehmanSayed — Да — к сожалению, я не думаю, что C # в этом случае будет идеальным.

Ответ №2:

Если вы знаете максимальное количество десятичных разрядов, например, 10, затем используйте:

 string strFormat = "#,#0.##########";
 

Обновить:

Это максимальное число известно. Согласно документации Microsoft, значение Double имеет точность до 15 десятичных разрядов (включая как до, так и после десятичной точки). Более 15 цифр будут округлены.

Итак, если вы должны вызвать этот метод ‘double.parse’ и можете отправить только формат, это лучшее, что вы можете сделать:

 string strFormat = "#,#0.###############";
 

Комментарии:

1. Вам не хватает одного # между запятой и 0 .

2. @Paul Кажется, что все работает нормально. # Для чего нужен второй?

3. Вы хотите представить разделитель тысячи (9 999 999,99999999). Я подозреваю, что если вы протестируете свой код, вы можете обнаружить, что получаете 9,99,99,99.999999999…

Ответ №3:

Вы можете динамически вычислять форматирование для каждого числа:

 public static void Main()
{
    var number = 1234.12312323123;

    var format = GetNumberFormat(number);
    Console.WriteLine(number.ToString(format));
}

public static string GetNumberFormat(double number)
{
    var numberAsString = number.ToString();

    var decimalPartSize = numberAsString.Substring(numberAsString.LastIndexOf('.')   1).Length;

    return $"N{decimalPartSize}";
}
 

Итак

 number = 1234.12312323123
 

даст вам 1,234.12312323123 . Работает и для отрицательных чисел. Кроме того, при работе со строками не будет никаких ошибок округления или искажений точности.

Комментарии:

1. Просто любопытно, почему единственное рабочее решение здесь отклонено?

2. У меня нет свободы делать это, поскольку я могу передавать формат только извне. (Уже упоминалось об этом в вопросе)

3. @AbdulRehmanSayed Вы можете установить формат только один раз или для каждого отдельного вызова? В приведенном вами примере используется именно toString() с форматированием. Либо предоставьте фактический вызов кода, либо укажите, какова именно ваша среда, поскольку в настоящее время существует несоответствие. Существуют разные решения для разных проблем.

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

5. @AbdulRehmanSayed «Я не могу использовать какую-либо культуру или что-то в этом роде, и разработчик, функцию которого я вызываю, дал мне только способ изменить формат, передав в качестве параметра strFormat .» — Нет, вы не упомянули, что вызываете функцию только один раз. В этом весь смысл того, что вы предоставляете код, чтобы люди могли вам помочь.