我有一些具有十进制属性的实体。这些实体的属性显示在我的UI中的多个位置。
目前我发现自己在做:
litWeight.Text = person.Weight.ToString("0.00");
到处都是。
现在我知道一个事实,在几个例子中,并且我怀疑许多其他人,客户可能想要3dh的值。在将来。
我是否可以使用一些模式来处理此Weight属性的格式(以及其他属性;不仅仅是小数,也许是日期等),以便我可以在一个地方进行此格式化?
我知道可以在webconfig中使用formatstring,或者在UI中编写一些扩展方法,但这些方法看起来并不是很优雅。
有一些与我的实体绑定的格式化对象会很好,因此它本身就很明显可以使用哪种格式化程序。
谢谢,
安德鲁
答案 0 :(得分:2)
最简单的解决方案是使用静态方法创建一个实用程序类,该方法可以适当地格式化不同类型的值并调用它们。例如:
litWeight.Text = Utility.FormatWeight(person.Weight);
答案 1 :(得分:1)
您是否可以向实体添加方法以格式化主题?然后,每个对象都可以委托“策略”对象进行实际格式化。
这样做的原因是既可以更改小数位等,也可以允许国际化等内容 - 小数格式取决于语言环境;有些国家/地区使用十进制逗号代替点数,或者使用三角以外的数字组等数字。
编辑:评论是将表示代码放在域层中。是的,所以对所有设计问题应用标准修复;再添加一层间接:)
您可能不希望拥有完整的MVC,但View和Model的概念似乎仍然合适。也许,对于每个实体,定义一个View类,所以PersonView保持对Person对象的引用,并且对于感兴趣的Person的每个属性都有名为format_weight等的属性?它应该仍然使用策略模式进行实际格式化。
所以你的例子就是
PersonView pv = new PersonView(person)
litWeight.Text = pv.format_weight();
(请原谅语法错误,我不会说C#)
如果需要,可以通过重新实现方法/属性并将其引用到引用的Person,或者通过在创建PersonView时继承Person来使PersonView替换为Person;
答案 2 :(得分:1)
你可以创建一个非常基本的用户控件 - 从标签或类似的东西派生 - 它完全负责显示一个权重字符串,然后你有:
weightValue.DisplayValue(person.Weight);
并且setter根据需要格式化小数。如果在显示重量时使用此选项,则只需更改用户控件即可更改所有重量显示。
基本版可能是:
public void DisplayValue(decimal weight)
{
this.Text = weight.ToString("0.00");
}