【问题标题】:number formation as per os system根据操作系统系统的数字形成
【发布时间】:2014-05-05 13:11:33
【问题描述】:

我正在使用带有 C# 的 .NET 3.5 框架 我的应用程序将在全球范围内使用。 (Windows 7、64 位)

我有一个双精度/浮点数,稍后会转换为字符串。 但在不同的操作系统上,它会改变像 46.57 这样的值变成 46,57

我怎样才能阻止这种情况? .NET 可以在内部处理这个吗?

下面是我的代码;

Decimal lon = Convert.ToDecimal(dt.Rows[j]["lon"]);    
Decimal lat = Convert.ToDecimal(dt.Rows[j]["lat"]);    
lon = lon / 100000;    
lat = lat / 100000;    
string longitude = Convert.ToString(lon);    
string latitude = Convert.ToString(lat);

【问题讨论】:

  • 因为你的操作系统有不同的CurrentCulture
  • 我如何编码才能在所有操作系统上工作?
  • 这是默认行为,在大多数情况下,这是可取的(用户以他们期望的格式查看十进制数字和日期的格式)。当您正在写入文本文件或 XML 文件并希望确保保存在一种文化中的数据在另一种文化中可读时,这没有有用。
  • @Hardik 这不取决于您的操作系统。 这取决于您的操作系统当前的文化。 正如我在回答中所说,如果您的两个操作系统具有相同的文化,那将没问题。或者您可以设置一些属性以在两个操作系统中使用小数分隔符(可能还有千位分隔符),正如我在回答中的最后一句话所说。

标签: c# formatting decimal


【解决方案1】:

正如其他人所解释的,这是默认的和期望的行为。

您可以使用InvariantCulture 始终以相同的格式输出:

string longitude = Convert.ToString
                   ( lon
                   , System.Globalization.CultureInfo.InvariantCulture
                   );

【讨论】:

    【解决方案2】:

    十进制值的字符串表示是特定于文化的。

    Convert.ToString(decimal) 方法使用当前区域性线程。

    这里是implemented;

    public static string ToString(decimal value)
    {
         return value.ToString(CultureInfo.CurrentCulture);
    }
    

    可能您的一个操作系统使用的文化将. 设为NumberDecimalSeparator,而另一个操作系统使用的文化将, 设为NumberDecimalSeparator

    我怎样才能阻止这种情况? .NET 可以在内部处理这个吗?

    .NET 无法处理这个问题。它使用它发现的任何东西作为当前文化。

    但你可以。

    在您的两个操作系统中使用相同的文化线程可以解决此问题,或者您可以使用 CultureInfo.Clone method 克隆您当前的文化并将您的 NumberDecimalSeparator 属性设置为您想要的任何字符串。

    【讨论】:

      【解决方案3】:

      差异是每台机器/操作系统上的文化的函数。我鼓励您更明确地使用 ToString() 转换。如果没有这些参数,您将把它留给 .NET 为您做出决定。例如:

      string longitude = lon.ToString("G", new CultureInfo("en-US"));
      

      您可以找到更多有效转化示例here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-25
        • 2018-11-01
        • 2016-04-15
        • 2023-03-27
        • 2014-05-27
        • 2011-02-21
        • 1970-01-01
        相关资源
        最近更新 更多