Строковый формат описательного текста
Можно ли добавить некоторый описательный текст в спецификатор формата строки?
Пример:
string.Format ("{0:ForeName} is not at home", person.ForeName);
В примере ForeName
добавлено как описание.
Вышеприведенный синтаксис явно неверен, но просто для того, чтобы показать идею.
Причина, по которой я спрашиваю, заключается в том, что в моем случае строки находятся в файле ресурсов, поэтому в файле ресурсов, который вы в настоящее время видите только
{0} is not at home
в некоторых случаях трудно понять, что такое контекст {0}
.
EDIT:
В С# 6 введена строковая интерполяция с оператором $
, поэтому string.Format
больше не требуется:
$"{person.ForeName} is not at home";
Ответы
Ответ 1
Обычно мы помещаем комментарии в наш файл ресурсов, например. {0} = Forename
.
Тогда любой, кто может переводить строку, знает, что {0}
представляет и может переводить соответственно.
Также, если вы используете ReSharper, вы можете ввести комментарий в то же время, когда вы добавляете свою строку в ресурсы.
Ответ 2
Фил Хаак и Пели написали несколько интересных сообщений в блоге об альтернативах функции string.format по умолчанию. Они могут вас заинтересовать.
В основном они позволяют использовать свойства объекта внутри строки формата следующим образом:
string s = NamedFormat("Hello {FullName} ({EmailAdrress})!", person);
Вы можете связать записи в блоге здесь:
Возможно, одно из решений, охватываемых этими сообщениями в блоге, подойдет вашим потребностям.
Ответ 3
Для строк ваш метод должен работать, поскольку строки будут игнорировать любые спецификаторы формата. Однако вы рискуете случайно использовать это для нестроковых типов, и в этом случае строка будет либо переведена как коды формата, либо будет отображаться буквально:
string.Format ("{0:ForeName} is not at home", "Johnny");
//"Johnny is not at home"
string.Format ("{0:ForeName} will be home at {1:HomeTime}", "Johnny", DateTime.Today)
//Johnny will be home at 0o0eTi0e -- H, h, and m are DateTime format codes.
Однако, поскольку вы храните их в файле ресурсов, вместо этого я бы использовал поле комментария в файле ресурсов - вы могли бы сохранить копию строки формата и добавить там свои описания.
Ответ 4
Для этого нет встроенной функции С#. Лучшее, что я могу предложить, - вставить комментарий (это не повлияет на производительность):
string.Format ("{0"/*ForeName*/+"} is not at home", person.ForeName);
Personnaly, я не считаю его доступным для чтения, лучше всего использовать сторонний инструмент, как предложил Давид Хайкин в комментарии (см. этот ответ)
Ответ 5
Демо-версия IDEOne.com
Вот несколько наивная реализация метода StackOverflow formatUnicorn
:
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Reflection;
public class Test
{
public static void Main()
{
string formatString = "{firstName} {lastName} is awesome.";
Console.WriteLine(formatString.FormatUnicorn(new {
firstName = "joe",
lastName = "blow"
}));
}
}
public static class StringExtensions {
public static string FormatUnicorn(this string str, object arguments) {
string output = str;
Type type = arguments.GetType();
foreach (PropertyInfo property in type.GetProperties())
{
Regex regex = new Regex(@"\{" + property.Name + @"\}");
output = regex.Replace(output, property.GetValue(arguments, null).ToString());
}
return output;
}
}
Самый большой недостаток здесь - использование отражения, которое может быть медленным. Другим является то, что он не позволяет спецификаторов формата.
Лучшим подходом может быть создание более сложного регулярного выражения, которое просто удаляет комментарии.
Ответ 6
string.Format ("{0} is not at home {1} ", person.ForeName, person.Something);
Это должно печатать имя ForeName вместо {0} и что-то в {1}. Нет никакого способа, как вы сказали.
Ответ 7
Как и в Visual Studio 2015, вы можете сделать это с помощью Interpolated Strings (это трюк компилятора, поэтому не имеет значения, какая версия рамки .net, на которые вы нацелились).
Затем код выглядит примерно так:
string txt = $"{person.ForeName} is not at home {person.Something}";
Это не идеально, если вы хотите поместить строки в файлы ресурсов для перевода, но он делает код более удобочитаемым и меньше подвержен ошибкам.