【问题标题】:remove regionals from decimal从十进制中删除区域
【发布时间】:2012-07-13 13:04:49
【问题描述】:

我们有区域相关的网络客户端,其中货币设置为区域格式,我们解析如下:

bool result = decimal.TryParse(currencyValue, NumberStyles.Currency, myCulture, out value);

当我们将此十进制序列化为 xml 并且之前在 myCulture=en-US 中解析了十进制时,xmlserializer 返回 <Curr id="2" amnt="100000000.00"/> 并将其反序列化回相同的数字...但是当我们在 sk-SK 或 cs-CZ 中执行此操作时它返回 <Curr id="2" amnt="100000000,00"/> 在反序列化时返回 *100(忽略逗号)...

是否有可能从十进制中删除该区域,或使其保持不变? (如果我不想将其转换为字符串并再次解析以处理区域)

【问题讨论】:

  • 在各处使用相同的文化进行序列化(InvariantCulture 看起来很合适)。
  • 如果我理解正确 - 我很难相信。您确定您没有使用 XmlSerializer 来序列化字符串而不是小数吗?还是您使用自定义序列化?发布说明正在发生的事情的代码。
  • 是的,我确定它是一个小数,是的,这对我来说也是难以置信的......有一个小数吗?对象,在调试时显示值 100,但如果使用 en-EN 语言环境解析,则在 xml 中写入 100.00,如果是 cs-CZ,则写入 100,00 ...现在我无法从家里显示更多代码无权访问 tfs。

标签: c# asp.net type-conversion


【解决方案1】:

所以我写下我自己问题的答案,以便可以关闭这个主题...

有一个新的有趣点,我今天早上开始工作后得到的。在序列化之前将有问题的小数添加到字典中,这有点问题,因为 IDictionary 不能被序列化,直到它实现 IXmlSerializable。有两种方法可以覆盖,ReadXml 和 WriteXml。这是目标,在 WriteXml 中使用了decimalValue.ToString(),这导致了问题。我不知道为什么,但是这个.ToString() 返回了我所描述的不匹配结果。我不知道它是如何发生的,因为在测试项目中它运行良好,但在我们的完整上下文中却没有。但正如特工 Mulder 所相信的那样,the truth is out there

所以我唯一需要做的就是将decimalValue.ToString() 更改为decimalValue.ToString(CultureInfo.InvariantCulture)

感谢您的宝贵时间。

【讨论】:

    【解决方案2】:

    区域用于屏幕显示——您以用户理解或喜欢的格式向用户显示信息。当数据没有被显示给用户时(在内存中、在数据库中、通过网络),总是以已知的格式对其进行序列化。正如@Oded 所说,就文化信息而言,这通常是InvariantCulture。

    这使您可以将数据从一种文化转移到另一种文化,而无需让每种文化了解另一种文化。

    【讨论】:

    • 我们正在使用具有不变文化的标准 .net(反)序列化(我现在不确定,是否已定义)...我们的问题是,我们使用区域性的唯一地方设置是在解析传入的数据并在页面上显示...用户将数量插入文本框,然后我们使用选定的区域设置对其进行解析(我有两个用户,一个使用 en-EN,第二个使用 cs-CZ)...结果从这是一个小数? (可为空),它围绕所有过程(没有其他区域检查或处理)......这个小数?正如我在我的问题中所写的那样,最后被序列化为 xml。
    • 用户输入数据 -> 程序使用用户区域设置解析数据 -> 解析数据以不变的文化存储。显示数据时 -> 使用不变的文化检索数据 -> 数据是用户文化(en-EN 或 cs-CZ)中的格式化程序 -> 为用户显示数据。
    猜你喜欢
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    相关资源
    最近更新 更多