如何为字符串格式提供自定义字符串占位符
我有一个字符串,
string str ="Enter {0} patient name";
我正在使用 string.format 来格式化它。
String.Format(str, "Hello");
现在,如果我还想从某些配置中检索病人,那么我需要将 str 更改为类似的内容 “输入 {0} {1} 名称”
。 因此它将用第二个值替换 {1}。 问题是我想要代替 {1} 一些其他格式,例如 {pat}
。 但是当我尝试使用时,它会抛出错误。 我想要不同格式的原因是我需要像这样更改很多文件(可能包含 {0}、{1} 等)。 所以我需要一个可以在运行时替换的自定义占位符。
I have a string
string str ="Enter {0} patient name";
I am using string.format to format it.
String.Format(str, "Hello");
Now if i want patient also to be retrieved from some config then I need to change str to something like"Enter {0} {1} name"
. So it will replace the {1} with second value. The problem is that I want instead of {1} some other format something like {pat}
. But when I try to use, it throws an error. The reason I want a different format is that there are lot of files I need to change like this(which may contain {0},{1} etc). So I need a custom placeholder which can be replaced at run-time.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
您可能想查看 FormatWith 2.0,作者:James Newton-King。 它允许您使用属性名称作为格式化标记,如下所示:
您还可以将其与匿名类型一起使用。
更新:还有一个类似的解决方案,作者是Scott Hanselman 但它是作为
Object
而不是String 上的一组扩展方法实现的
。更新 2012:您可以获取 Calrius Consulting 的 NETFx String.FormatWith 扩展方法 NuGet.org 上的 NuGet 包
2014 年更新:还有 StringFormat.NET 和 littlebit 的 StringFormat
You might want to check out FormatWith 2.0 by James Newton-King. It allows you to use property names as formatting tokens such as this:
You can also use it with anonymous types.
UPDATE: There is also a similar solution by Scott Hanselman but it is implemented as a set of extension methods on
Object
instead ofString
.UPDATE 2012: You can get Calrius Consulting's NETFx String.FormatWith Extension Method NuGet package on NuGet.org
UPDATE 2014: There is also StringFormat.NET and littlebit's StringFormat
带有
MatchEvaluator
的Regex
似乎是一个不错的选择:Regex
with aMatchEvaluator
seems a good option:但是你可以逃避:
However you can get away with:
您可能最好对自定义字段使用 Replace,对其余字段使用 Format,例如:
You are probably better off using Replace for the custom field and Format for the rest, like:
我看到了上面的所有答案,但无法正确回答问题:)
以下代码不满足您的要求是否有任何特殊原因?
I saw all the answers above, yet, couldn't get the question right :)
Is there any particular reason why the following code does not meet your requirement?
这是我在这里找到的另一个版本: http://www.reddit .com/r/programming/comments/bodml/beef_up_params_in_c_5_to_solve_lambda_abuse/c0nrsf1
任何解决方案都将涉及反射,这不太理想,但这里是他的代码,解决了其他一些主要性能问题。 (没有错误检查。如果您愿意,可以添加它。):
1) 使用直接运行时反射,没有 DataBinder 开销
2) 不使用正则表达式,使用单遍解析和状态。
3) 不将字符串转换为中间字符串,然后再次将其转换为最终格式。
4) 使用单个 StringBuilder 进行分配和连接,而不是到处更新字符串并将它们连接成新字符串。
5) 消除了为 n 次替换操作调用委托的堆栈开销。
6) 一般来说,单次传递将以相对线性的方式扩展(每个 prop 查找和嵌套 prop 查找仍然有一些成本,但仅此而已。)
Here's another version of this that I found here: http://www.reddit.com/r/programming/comments/bodml/beef_up_params_in_c_5_to_solve_lambda_abuse/c0nrsf1
Any solution to this is going to involve reflection, which is less than ideal, but here's his code with some of the other major performance issues resolved. (No error checking. Add it if you like.):
1) Uses direct runtime reflection, no DataBinder overhead
2) Doesn't use regular expressions, uses a single-pass parse and state.
3) Doesn't convert the string into an intermediate string and then convert it again to the final format.
4) Allocates and concatenates with a single StringBuilder instead of newing up strings all over the place and concatenating them into new strings.
5) Removes the stack overhead of calling a delegate for n replace operations.
6) In general is a single pass through that will scale in a relatively linear manner (still some cost for each prop lookup and nested prop lookup, but that's that.)
您还可以使用 Marc Gravell 和扩展 String 类对象中的示例:
示例用法:
You can also use the example from Marc Gravell and Extend the String class object:
Example usage:
我想要一些更像 Python 字符串格式化的东西,所以我写了这个:
https://gist.github.com/samwyse/b225b32ae1aea6fb27ad9c966b9ca90b
像这样使用它:
I wanted something that worked more like Python's string formatting, so I wrote this:
https://gist.github.com/samwyse/b225b32ae1aea6fb27ad9c966b9ca90b
Use it like this: