Можно ли определить максимальное количество символов в строках формата C#, как в C printf?

не нашел как это сделать. Что я нашел более или менее на линии (http://blog.stevex.net/string-formatting-in-csharp/):

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

String.Format(“->{1,10}<-”, “Hello”);  // gives "->     Hello<-" (left padded to 10)
String.Format(“->{1,-10}<-”, “Hello”); // gives "->Hello     <-" (right padded to 10)

5 ответов


то, что вы хотите, не "изначально" поддерживается форматированием строк C#, как String.ToString методы объекта string просто возвращают саму строку.

когда вы называете

string.Format("{0:xxx}",someobject);

Если someobject реализует интерфейс IFormattable, перегрузка ToString (string format,iformatprovider formatProvider) метод вызывается, с " xxx " как


Я написал пользовательский форматер, который реализует спецификатор формата "L", используемый для установки максимальной ширины. Это полезно, когда нам нужно контролировать размер нашего форматированного вывода, скажем, когда он предназначен для столбца базы данных или поля Dynamics CRM.

public class StringFormatEx : IFormatProvider, ICustomFormatter
{
    /// <summary>
    /// ICustomFormatter member
    /// </summary>
    public string Format(string format, object argument, IFormatProvider formatProvider)
    {
        #region func-y town
        Func<string, object, string> handleOtherFormats = (f, a) => 
        {
            var result = String.Empty;
            if (a is IFormattable) { result = ((IFormattable)a).ToString(f, CultureInfo.CurrentCulture); }
            else if (a != null) { result = a.ToString(); }
            return result;
        };
        #endregion

        //reality check.
        if (format == null || argument == null) { return argument as string; }

        //perform default formatting if arg is not a string.
        if (argument.GetType() != typeof(string)) { return handleOtherFormats(format, argument); }

        //get the format specifier.
        var specifier = format.Substring(0, 1).ToUpper(CultureInfo.InvariantCulture);

        //perform extended formatting based on format specifier.
        switch(specifier)
        {
            case "L": 
                return LengthFormatter(format, argument);
            default:
                return handleOtherFormats(format, argument);
        }
    }

    /// <summary>
    /// IFormatProvider member
    /// </summary>
    public object GetFormat(Type formatType)
    {
        if (formatType == typeof(ICustomFormatter))
            return this;
        else
            return null;
    }

    /// <summary>
    /// Custom length formatter.
    /// </summary>
    private string LengthFormatter(string format, object argument)
    {
        //specifier requires length number.
        if (format.Length == 1)
        {
            throw new FormatException(String.Format("The format of '{0}' is invalid; length is in the form of Ln where n is the maximum length of the resultant string.", format));
        }

        //get the length from the format string.
        int length = int.MaxValue;
        int.TryParse(format.Substring(1, format.Length - 1), out length);

        //returned the argument with length applied.
        return argument.ToString().Substring(0, length);
    }
}

использование

var result = String.Format(
    new StringFormatEx(),
    "{0:L4} {1:L7}",
    "Stack",
    "Overflow");

Assert.AreEqual("Stac Overflo", result);

не можете ли вы просто применить аргументы длины, используя параметр, а не формат?

строку.Формат("->{0}Привет

или написать свой собственный форматер, чтобы позволить вам сделать это?


почему бы просто не использовать Substr для ограничения длины строки?

String s = "abcdefghijklmnopqrstuvwxyz";
String.Format("Character limited: {0}", s.Substr(0, 10));

это не ответ о том, как использовать строку.формат, но другой способ сокращения строки с помощью методов расширения. Этот способ позволяет добавлять максимальную длину строки напрямую, даже без строки.формат.

public static class ExtensionMethods
{
    /// <summary>
    ///  Shortens string to Max length
    /// </summary>
    /// <param name="input">String to shortent</param>
    /// <returns>shortened string</returns>
    public static string MaxLength(this string input, int length)
    {
        if (input == null) return null;
        return input.Substring(0, Math.Min(length, input.Length));
    }
}

пример использования:

string Test = "1234567890";
string.Format("Shortened String = {0}", Test.MaxLength(5));
string.Format("Shortened String = {0}", Test.MaxLength(50));

Output: 
Shortened String = 12345
Shortened String = 1234567890