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

Строковый формат описательного текста

Можно ли добавить некоторый описательный текст в спецификатор формата строки?

Пример:

  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";
4b9b3361

Ответ 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}"; 

Это не идеально, если вы хотите поместить строки в файлы ресурсов для перевода, но он делает код более удобочитаемым и меньше подвержен ошибкам.