Строковый формат насчитывает тысячи 123K, миллионы 123M, миллиарды 123B

#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