字符串格式描述性文本

时间:2014-01-23 14:50:28

标签: c#

是否可以在字符串格式说明符中添加一些描述性文本?

示例:

  string.Format ("{0:ForeName} is not at home", person.ForeName); 

在示例ForeName中添加了描述。

上述语法显然不正确,只是为了表明这个想法。

我问的原因是因为在我的情况下字符串是在资源文件中,所以在资源文件中你目前只看到

   {0} is not at home

在某些情况下,很难理解{0}的背景是什么。

修改

在c#6中引入了使用$运算符的字符串插值,因此不再需要string.Format

$"{person.ForeName} is not at home";

7 个答案:

答案 0 :(得分:13)

我们通常会在我们的资源文件中添加评论,例如{0} = Forename

然后,任何可能正在翻译字符串的人都知道{0}代表什么,并且可以相应地进行翻译。

此外,如果您使用ReSharper,则可以在将字符串添加到资源时同时输入注释。

答案 1 :(得分:13)

Phil Haack和Peli撰写了几篇关于默认string.format函数替代品的有趣博客文章。他们可能会对你感兴趣。

基本上,它们允许您在格式字符串中使用对象属性,如下所示:

string s = NamedFormat("Hello {FullName} ({EmailAdrress})!", person);

您可以在此处发布相关博文:

这些博客文章中涵盖的其中一个解决方案可能符合您的需求。

答案 2 :(得分:7)

对于字符串,您的方法应该有效,因为字符串将忽略任何格式说明符。但是,您可能会意外地将其用于非字符串类型,在这种情况下,字符串将被转换为格式代码或字面显示:

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.

但是,由于您将这些文件存储在资源文件中,我会使用资源文件中的“注释”字段 - 您可以存储格式字符串的副本并在那里添加描述。

答案 3 :(得分:4)

没有内置的C#功能。我能提议的最好的是插入评论(这不会对性能产生影响):

string.Format ("{0"/*ForeName*/+"} is not at home", person.ForeName);

Personnaly,我发现它不具有可读性,最好的方法是使用第三方工具,正如David Khaykin在评论中所建议的那样(见this answer

答案 4 :(得分:4)

IDEOne.com demo

这是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;
    }
}

这里最大的缺点是使用反射,它可以。另一个是它不允许使用格式说明符。

更好的方法可能是创建一个更复杂的正则表达式,只删除注释。

答案 5 :(得分:1)

 string.Format ("{0} is not at home {1} ", person.ForeName, person.Something); 

这将打印ForeName而不是{0}和{1}中的内容。你说没有办法。

答案 6 :(得分:0)

从Visual Studio 2015开始,您可以使用Interpolated Strings执行此操作(这是一个编译器技巧,因此您定位的.net框架版本无关紧要。)

然后代码看起来像这样

string txt = $"{person.ForeName} is not at home {person.Something}"; 

如果你想把字符串放到资源文件中进行翻译,它并不理想,但是它会使代码更具可读性并且更不容易出错。