Извлечение двоеточия через строку формата в .NET - PullRequest
9 голосов
/ 24 июня 2009

Кто-нибудь знает, как создать строку формата в .NET, чтобы полученная строка содержала двоеточие?

Подробно, у меня есть значение, скажем 200, которое мне нужно отформатировать как соотношение, т.е. "1: 200". Поэтому я создаю строку формата, например, «1: {0: N0}», которая отлично работает. Проблема в том, что я хочу, чтобы ноль отображался как «0», а не «1: 0», поэтому моя строка формата должна выглядеть примерно так: «{0: 1: N0 ;; N0}», но, конечно, это не работает.

Есть идеи? Спасибо!

Ответы [ 5 ]

16 голосов
/ 24 июня 2009
using System;

namespace ConsoleApplication67
{
    class Program
    {
        static void Main()
        {
            WriteRatio(4);
            WriteRatio(0);
            WriteRatio(-200);

            Console.ReadLine();
        }

        private static void WriteRatio(int i)
        {
            Console.WriteLine(string.Format(@"{0:1\:0;-1\:0;\0}", i));
        }
    }
}

дает

1:4
0
-1:200

Разделитель ; в строках формата означает «делать положительные числа, как это; отрицательные числа как это; и ноль, как это ». \ ускользает от толстой кишки. Третий \ не является строго необходимым, поскольку буквенный ноль совпадает со стандартным числовым форматом, выводимым для нуля:)

3 голосов
/ 24 июня 2009

Вы можете использовать решение AakashM. Если вы хотите что-то более читабельное, вы можете создать своего собственного провайдера:

internal class RatioFormatProvider : IFormatProvider, ICustomFormatter
{
    public static readonly RatioFormatProvider Instance = new RatioFormatProvider();
    private RatioFormatProvider()
    {

    }
    #region IFormatProvider Members

    public object GetFormat(Type formatType)
    {
        if(formatType == typeof(ICustomFormatter))
        {
            return this;
        }

        return null;
    }

    #endregion

    #region ICustomFormatter Members

    public string Format(string format, object arg, IFormatProvider formatProvider)
    {
        string result = arg.ToString();

        switch(format.ToUpperInvariant())
        {
            case "RATIO":
                return (result == "0") ? result : "1:" + result;
            default:
                return result;
        }
    }

    #endregion
}

С этим провайдером вы можете создавать очень удобочитаемые строки формата:

int ratio1 = 0;
int ratio2 = 200;
string result = String.Format(RatioFormatProvider.Instance, "The first value is: {0:ratio} and the second is {1:ratio}", ratio1, ratio2);

Если вы управляете форматируемым классом (а не примитивным, таким как Int32), вы можете сделать это более привлекательным. Подробнее см. в этой статье .

1 голос
/ 24 июня 2009
String.Format(n==0 ? "{0:NO}" : "1:{0:NO}",n);
1 голос
/ 24 июня 2009

Как насчет этого:

String display = (yourValue == 0) ? "0" : String.Format("1:{0:N0}", yourValue);
0 голосов
/ 24 июня 2009

Ну, один из способов - поместить его в оператор if и по-разному отформатировать, если он равен нулю.

...