#c# #string #formatting
#c# #строка #форматирование строк
Вопрос:
Не нашел, как это сделать. То, что я нашел, было более или менее похоже на строки этого (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)
Комментарии:
1. Чего именно вы пытаетесь достичь? Можете ли вы опубликовать примеры того, что вы хотели бы видеть?
2. я пытаюсь преобразовать строки формата C в строки формата C #. в C вы можете указать %-4.4s и тому подобное.
3. почему голосование против? это важный вопрос!
4. и что более важно, если нет недостатка в дизайне строк формата C #.
5. Я бы не назвал это недостатком . Скорее всего, конкретная функция, которую вы ищете, недоступна. Строка. Формат также поддерживает несколько функций, отсутствующих в строках формата C. Означает ли это, что строки формата C обязательно имеют недостатки?
Ответ №1:
То, что вы хотите, «изначально» не поддерживается форматированием строк C #, поскольку String.ToString
методы объекта string просто возвращают саму строку.
Когда вы вызываете
string.Format("{0:xxx}",someobject);
если someobject реализует интерфейс IFormattable, вызывается метод перегрузки toString(string format,IFormatProvider formatProvider formatProvider) с параметром «xxx» в качестве format
параметра.
Таким образом, в лучшем случае это не недостаток в дизайне форматирования строк .NET, а просто недостаток функциональности в классе string .
Если вам это действительно нужно, вы можете использовать любое из предложенных обходных путей или создать свой собственный класс, реализующий интерфейс IFormattable.
Комментарии:
1. Спасибо! ты определенно прав. это класс string, которому чего-то не хватает. но использовали ли вы xxx в качестве примера какого-либо формата или это действительно что-то значит (например, 3 символа)?
2. @matti, no xxx был просто примером. На самом деле, что это означает, определяется реализацией интерфейса IFormattable. В любом случае (говоря как любитель c ), форматирование строк в c по сравнению с форматированием в c # отстой , разговоры о недостатке из-за того, что эта конкретная функция отсутствует, кажутся мне довольно странными 😉
Ответ №2:
Это не ответ о том, как использовать 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
Ответ №3:
Я написал пользовательский форматировщик, который реализует спецификатор формата «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 resu<
};
#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);
Комментарии:
1. Хотелось бы, чтобы что-то подобное было включено в c # по умолчанию или, по крайней мере, как самородок
Ответ №4:
Разве вы не можете просто применить аргументы длины, используя параметр, а не формат?
Строка.Формат(«->{0}<-«, Форматирование.PadRight(10)); // ->Привет <-
Или написать свой собственный форматировщик, который позволит вам это сделать?
Ответ №5:
Почему бы просто не использовать Substr для ограничения длины вашей строки?
String s = "abcdefghijklmnopqrstuvwxyz";
String.Format("Character limited: {0}", s.Substr(0, 10));
Комментарии:
1. Я упустил из виду тот факт, что даже Substr имеет некоторую неудобную реализацию, отличную от любого другого языка. Я использовал это обходное решение как есть, и оно терпит неудачу, когда строка короче 10 символов…
Ответ №6:
Возможно, вы захотите использовать этот помощник в будущем приложении, он ограничивает строку заданной максимальной длиной, а также дополняет, если она короче заданного предела.
public static class StringHelper
{
public static string ToString(this string input , int maxLength , char paddingChar = ' ', bool isPaddingLeft = true)
{
if (string.IsNullOrEmpty(input))
return new string('-', maxLength);
else if (input.Length > maxLength)
return input.Substring(0, maxLength);
else
{
int padAmount = maxLength - input.Length;
if (isPaddingLeft)
return input new string(paddingChar, padAmount);
else
return new string(paddingChar, padAmount) input;
}
}
}
и вы могли бы использовать его как:
string inputStrShort = "testString";
string inputStrLong = "mylongteststringexample";
Console.WriteLine(inputStrShort.ToString(20, '*', true)); // Output : testString**********
Console.WriteLine(inputStrLong.ToString(20, '*', true)); // Output : mylongteststringexam