Подтвердить что ты не робот

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

Не нашел, как это сделать. То, что я нашел, было более или менее по строкам этого (http://blog.stevex.net/string-formatting-in-csharp/):

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

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

Ответ 1

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

Когда вы вызываете

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

Если какой-то объект реализует интерфейс IFormattable, вызывается метод перегрузки format.

Таким образом, это не ошибка в дизайне форматирования строки .NET, а просто отсутствие функциональности в классе строк.

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

Ответ 2

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

String.Format( "- > {0} < -", toFormat.PadRight(10));//- > Hello < -

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

Ответ 3

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

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

Ответ 4

Я написал специальный форматир, который реализует спецификатор формата 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);

Ответ 5

Это не ответ на вопрос о том, как использовать string.format, но еще один способ сокращения строки с использованием методов расширения. Таким образом вы можете добавить максимальную длину в строку напрямую, даже без string.format.

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