将字符串转换为十进制之谜

发布于 2024-11-17 16:18:45 字数 289 浏览 0 评论 0原文

我面临着使用 C# .NET 从字符串转换为十进制的问题。问题是我编写了以下代码,并且在我的开发 Windows 7 .NET Framework 3.5 系统上运行良好。但是,如果我将应用程序移至 Windows 2003 Server .NET 3.5 Framework 上,结果会有所不同。谁能理解那里发生了什么吗?

代码:

dec = Convert.ToDecimal(strDec);

Windows 7 结果:85.00 Windows 2003 结果:8500

I'm facing a problem about the conversion from string to decimal using C# .NET. The problem is that I have wrote the following code and works fine on my development Windows 7 .NET Framework 3.5 system. But, if I move the application on the Windows 2003 Server .NET 3.5 Framework the result is different. Can anyone understand what happen there?

Code:

dec = Convert.ToDecimal(strDec);

Windows 7 result: 85.00
Windows 2003 result: 8500

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

冰魂雪魄 2024-11-24 16:18:45

您服务器上的区域和文化设置可能使用 , 设置为十进制,将 . 设置为数字分组。请参阅控制面板/区域和文化设置。

如果此数字字符串是由您的应用程序生成的,我将在这两个地方使用 CultureInfo.InvariantCulture

     Decimal dec = 85.0m;
     string s = dec.ToString (CultureInfo.InvariantCulture);
     decimal.Parse(s, CultureInfo.InvariantCulture);

It may be that the region and culture settings on your server are set with , as decimal, and . as digit grouping. See Control Panel/region and culture settings.

If this numeric string is generated by your application, I would use CultureInfo.InvariantCulture in both places.

     Decimal dec = 85.0m;
     string s = dec.ToString (CultureInfo.InvariantCulture);
     decimal.Parse(s, CultureInfo.InvariantCulture);
醉梦枕江山 2024-11-24 16:18:45

您会受到区域设置的影响。当在使用句号作为小数分隔符的语言环境中解析字符串 85.00 时,结果为 85.00。如果使用逗号作为小数分隔符,则结果为 8500。

在指定 CultureInfo 的位置使用重载:

var dec = Convert.ToDecimal(strDec, CultureInfo.GetCultureInfo("en"));

您还可以使用 CultureInfo.InvariantCulture,它是默认的 .NET >CultureInfo 和英文的CultureInfo类似。

在生产质量应用程序中,您应该始终指定或了解解析和格式化字符串时使用的 CultureInfo。如果您在项目中打开代码分析,当您忘记这样做时,您会收到警告:CA1304:指定文化信息

You are affected by regional settings. When the string 85.00 is parsed in a locale where full stop is used as decimal separator the result is 85.00. If comma is used as decimal separator the result is 8500.

Use the overload where you specify a CultureInfo:

var dec = Convert.ToDecimal(strDec, CultureInfo.GetCultureInfo("en"));

You can also use CultureInfo.InvariantCulture which is the default .NET CultureInfo and similar to the English CultureInfo.

In a production quality application you should always specify or know the CultureInfo used when you parse and format strings. If you turn code analysis on in your project you will get warnings when you forget to do that: CA1304: Specify CultureInfo.

嘴硬脾气大 2024-11-24 16:18:45

尝试使用文化无知模式

var decimalValue = Convert.ToDecimal(stringValue, CultureInfo.InvariantCulture);

Try using culture-ignorant mode

var decimalValue = Convert.ToDecimal(stringValue, CultureInfo.InvariantCulture);
无戏配角 2024-11-24 16:18:45

时遇到了这个问题

Convert.ToDecimal("0.5", CultureInfo.InvariantCulture); 

我们在0,5

,但

Convert.ToDecimal("0,5", CultureInfo.InvariantCulture);

当时是 5!

解决方案是使用

Convert.ToDecimal(stringValue.Replace(",", "."), CultureInfo.GetCultureInfo("en"));

We faced with the issue when

Convert.ToDecimal("0.5", CultureInfo.InvariantCulture); 

was 0,5

, but

Convert.ToDecimal("0,5", CultureInfo.InvariantCulture);

was 5!

The solution was to use

Convert.ToDecimal(stringValue.Replace(",", "."), CultureInfo.GetCultureInfo("en"));
悍妇囚夫 2024-11-24 16:18:45

所以,我使用了下一个函数

public static Decimal GetInvariantDecimal(string Value)
{
    try
    {
        Decimal d = 0;
        if (Decimal.TryParse(Value, out d))
            return d;
        else
            return Convert.ToDecimal(Value, System.Globalization.CultureInfo.InvariantCulture);
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

,但它仅适用于俄语,例如小数点分隔符

so, i used next function

public static Decimal GetInvariantDecimal(string Value)
{
    try
    {
        Decimal d = 0;
        if (Decimal.TryParse(Value, out d))
            return d;
        else
            return Convert.ToDecimal(Value, System.Globalization.CultureInfo.InvariantCulture);
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

But it only for Russian like decimal separator

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文