【问题标题】:Is there any way to control formatting of float/double in ASMX Web Services?有什么方法可以控制 ASMX Web 服务中浮点/双精度的格式吗?
【发布时间】:2011-03-03 22:59:24
【问题描述】:

如果我有以下简单的类:

[Serializable]
public class Test
{
    public double a = 0.0000001;
}

当我从 .NET ASMX Web 服务返回此类型的对象时,响应将是:

<Test>
  <a>1E-07</a>
</Test>

这也许不是巧合,是0.0000001.ToString() 的默认行为,尽管至少使用ToString,我可以指定格式参数(在这种情况下,我想要指数符号. 事实上,我什至不确定如何将它连接到 XmlSerializer 我可以完全控制它,更不用说仅仅从我可以放置在返回对象上的属性中了。

编辑:我仍然非常希望将属性保留在我实际将其应用于强类型的内容中。 0.0000001 和 1E-7 在 .NET 中都是有效的双重表示,我只想让它像另一个一样通过网络发送东西。

【问题讨论】:

  • 如果这个值验证了模式,那么你的客户为什么会关心呢?他们肯定可以消费任何有效的价值吗?如果他们不能,那么您需要更改架构以匹配他们可以处理的内容。
  • 业务用户与开发人员。除了 WS 端点,我们还有将数据转储到 CSV 文件等的工具。两者的需求之间通常没有太大的脱节,但我正在尝试将视觉美学与开发实用主义相协调。
  • “0.0000001 和 1E-7 在 .NET 中都是有效的双重表示”——但对于 WS,重要的是要有一个有效的 xs:double 表示。
  • 根据双精度(w3.org/TR/xmlschema-2/#double)和十进制(w3.org/TR/xmlschema-2/#decimal)的xsd文档,进一步定义了双精度的词法表示,情况仍然如此。

标签: .net web-services xml-serialization asmx


【解决方案1】:

一种简单的方法是将强类型属性标记为已忽略,并提供另一个字符串属性,仅用于 XML 序列化。在它的 getter 中,您可以根据需要应用格式,然后在 setter 中解析它。

【讨论】:

  • +1 指出这一点,但我应该指定(并且在编辑中这样做):如果可能的话,我真的很想保持这个强类型。上下文是针对公共 API 的,所以我想尽可能多地保留输入。
【解决方案2】:

将使用与the XML Schema xs:double datatype 兼容的表示通过网络发送双精度。

任何明智的客户都应该能够解释这一点。如果您出于某些特定原因想要使用不同的表示形式,唯一现实的解决方案是使用按您想要的方式格式化的字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 2010-10-22
    • 2011-11-17
    相关资源
    最近更新 更多