#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 .» — Нет, вы не упомянули, что вызываете функцию только один раз. В этом весь смысл того, что вы предоставляете код, чтобы люди могли вам помочь.