Можно ли определить максимальное количество символов в строках формата C #, как в C printf? - PullRequest
12 голосов
/ 05 ноября 2010

Не нашел как это сделать. То, что я обнаружил, было более или менее на линии этого (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)

Ответы [ 5 ]

7 голосов
/ 05 ноября 2010

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

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

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

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

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

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

1 голос
/ 16 сентября 2017

Это не ответ о том, как использовать 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
1 голос
/ 12 сентября 2017

Я написал собственный форматировщик, который реализует спецификатор формата "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 голосов
/ 05 ноября 2010

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

String s = "abcdefghijklmnopqrstuvwxyz";
String.Format("Character limited: {0}", s.Substr(0, 10));
0 голосов
/ 05 ноября 2010

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

String.Format ("-> {0} <-", toFormat.PadRight (10));// -> Здравствуйте, <- </p>

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

...