#c# #unity3d
#c# #форматирование строк
Вопрос:
Есть ли способ с помощью средства форматирования строк форматировать тысячи, миллионы, миллиарды в 123K, 123M, 123B без необходимости изменения кода для деления значения на тысячи, миллионы или миллиарды?
String.Format("{0:????}", LargeNumber)
Ответ №1:
Существуют разные способы достижения этой цели, но для меня самый простой и быстрый — использовать пользовательский спецификатор «,»
double value = 1234567890;
// Displays 1,234,567,890
Console.WriteLine(value.ToString("#,#", CultureInfo.InvariantCulture));
// Displays 1,234,568K
Console.WriteLine(value.ToString("#,##0,K", CultureInfo.InvariantCulture));
// Displays 1,235M
Console.WriteLine(value.ToString("#,##0,,M", CultureInfo.InvariantCulture));
// Displays 1B
Console.WriteLine(value.ToString("#,##0,,,B", CultureInfo.InvariantCulture));
Комментарии:
1. Если я использую его как «#,##0,,,. 00B» Это округление до последнего знака после запятой, но я этого не хочу.
2. значение. toString(«0,,,.#B», CultureInfo. Инвариантная культура) => 1.2B
3. есть ли способ использовать это с валютой?
4. А как насчет лакхов? как я могу это получить?
Ответ №2:
Я использую это сочетание форматов в методе расширения (просто добавьте его в свой проект и наслаждайтесь) 😎
public static string ToKMB(this decimal num)
{
if (num > 999999999 || num < -999999999 )
{
return num.ToString("0,,,.###B", CultureInfo.InvariantCulture);
}
else
if (num > 999999 || num < -999999 )
{
return num.ToString("0,,.##M", CultureInfo.InvariantCulture);
}
else
if (num > 999 || num < -999)
{
return num.ToString("0,.#K", CultureInfo.InvariantCulture);
}
else
{
return num.ToString(CultureInfo.InvariantCulture);
}
}
Использовать:
((decimal)235).ToKMB();
// 235
((decimal)1235).ToKMB();
// 1.2K
((decimal)6271235).ToKMB();
// 6.27M
((decimal)93246571235).ToKMB();
// 93.247B
Примечания:
Он возвращает больше деталей для больших чисел, и мне это нравится.
Он также поддерживает отрицательные числа. (Спасибо @Dusty за его замечание в комментариях.
Я пишу метод для
decimal
чисел в этом примере, вы можете написать некоторые переопределяющие методы для его поддержкиint
long
иdouble
использовать его без какого-либо приведения, например:
myIntNumber.ToKMB();
myLongNumber.ToKMB();
myDoubleNumber.ToKMB();
myDecimalNumber.ToKMB();
Комментарии:
1. А как насчет лакхов? как я могу это получить?
2. @ChandanKumar, ты имеешь в виду число, подобное 100,000? Мой метод расширения (
((decimal)100000).ToKMB()
) возвращает для него этот результат:100k
3. Стоит отметить, что это охватывает более полный вариант использования, если все
if
условия также охватывают отрицательные стороны … например,if(num > 999 || num < -999)
.
Ответ №3:
Вы можете реализовать ICustomFormatter, который делит значение на тысячи, миллионы или миллиарды, и использовать его следующим образом:
var result = string.Format(new MyCustomFormatter(), "{0:MyFormat}", number);
Комментарии:
1. Реализация должна включать как интерфейсы ICustomFormatter, так и IFormatProvider