我实际上实施了我的建议,因为它不需要很长时间就可以做到。似乎很好地工作。这是有限的,因为它假设{{x|y}}
与x作为十进制类型和y作为十进制字符数。我还用<###
和###>
来代替,因为$
用于正则表达式替换字符串(例如$ 1是第一个匹配的组等)。所以使用#
意味着我不必逃避它们。
只是柜面任何人的兴趣,下面的代码:
using System.Text.RegularExpressions;
public static class NustacheUtil
{
public static string PreProcess(string templateString)
{
return Regex.Replace(templateString, @"{{(.*?)\|(\d+)}}", @"<###{{$1}}|$2###>");
}
public static string PostProcess(string templateString)
{
var result = templateString;
for(;;)
{
var match = Regex.Match(result, @"<###([0-9.]+?)\|(\d+)###>");
if(!match.Success || match.Groups.Count != 3)
{
break;
}
decimal value;
if(decimal.TryParse(match.Groups[1].Value, out value))
{
var numDecimalPlaces = match.Groups[2].Value;
result = result.Remove(match.Index, match.Length);
result = result.Insert(match.Index, value.ToString("N" + numDecimalPlaces));
}
}
return result;
}
}
和几个测试:
using NUnit.Framework;
[TestFixture]
class NustacheUtilTests
{
[Test]
public void PreProcessTest_Single()
{
// Arrange
const string templateString = "Test number: {{MyNumber|3}}";
// Act
var result = NustacheUtil.PreProcess(templateString);
// Assert
Assert.That(result, Is.EqualTo("Test number: <###{{MyNumber}}|3###>"));
}
[Test]
public void PostProcessTest_Single()
{
// Arrange
const string templateString = "Test number: <###123.456789|3###>";
// Act
var result = NustacheUtil.PostProcess(templateString);
// Assert
Assert.That(result, Is.EqualTo("Test number: 123.457"));
}
[Test]
public void PreProcessTest_Multiple()
{
// Arrange
const string templateString = "Test number: {{MyNumber|3}}, and another: {{OtherNumber|2}}";
// Act
var result = NustacheUtil.PreProcess(templateString);
// Assert
Assert.That(result, Is.EqualTo("Test number: <###{{MyNumber}}|3###>, and another: <###{{OtherNumber}}|2###>"));
}
[Test]
public void PostProcessTest_Multiple()
{
// Arrange
const string templateString = "Test number: <###123.457|3###>, and another: <###947.74933|2###>";
// Act
var result = NustacheUtil.PostProcess(templateString);
// Assert
Assert.That(result, Is.EqualTo("Test number: 123.457, and another: 947.75"));
}
}
和用法与Nustache:
var templateString = NustacheUtil.PreProcess(templateString);
templateString = Render.StringToString(templateString, dataSource);
templateString = NustacheUtil.PostProcess(templateString);
它显然还没有被用于愤怒。当我进行更改时,我会在这里更新代码,因为我相信我会在正确使用它时进行改进。
来源
2014-04-25 14:04:45
Dan
你的问题是无题的StackOverflow。为什么不使用[T4](http://msdn.microsoft.com/zh-cn/library/bb126445.aspx)? –
为什么它是题外话?阅读帮助中心文章,它对我来说是主题。感谢T4的建议 - 我会做一些阅读。我以前听过这个名字,但还不知道。 – Dan
*要求我们推荐或找到工具,图书馆或最喜欢的非现场资源的问题是堆栈溢出的主题,因为它们倾向于吸引自以为是的答案和垃圾邮件。相反,请描述问题以及到目前为止解决问题所做的工作。*我没有制定SO规则,我很抱歉,虽然 –