15

我正在通过网络传递双倍,目前我这样做

double value = 0.25;
string networkMsg = "command " + value;

英语很好,它的networkMsg0.25 和法语的 0.25,但是当我从法国计算机转到英语计算机时,一侧是 0.25,另一侧是 0.25。

所以我可以在我的代码中使用区域不变的方法。

我发现networkMsg无论在哪个地区,Val() 都将始终读取 0.25。

但我找不到从值转换为 0.25 区域不变量的有保证的方法。会value.toString("0.0")工作吗?

4

3 回答 3

13

采用:

string networkMsg = "command " + value.ToString(CultureInfo.InvariantCulture);

或者:

string networkMsg = string.Format(CultureInfo.InvariantCulture, "command {0}", value);

这需要using System.Globalization;在文件的顶部。

注意:如果您需要全精度,以便您可以再次恢复精确的双精度,请使用具有往返格式Format的解决方案,而不仅仅是. 您可以使用其他格式字符串,例如将插入千位分隔符并四舍五入到四位小数(小数点后四位)。 {0:R}{0}{0:N4}


从 C# 6.0 (2015) 开始,您现在可以使用:

string networkMsg = FormattableString.Invariant($"command {value}");
于 2013-10-10T12:21:05.603 回答
12

.in 格式说明符实际上"0.0"并不意味着“点”——它的意思是“小数分隔符”——,在法国和其他几个欧洲文化中。你可能想要:

value.ToString(CultureInfo.InvariantCulture)

或者

value.ToString("0.0", CultureInfo.InvariantCulture)

有关信息,您可以通过检查fr文化来查看这一点(以及许多其他内容) :

var decimalSeparator = CultureInfo.GetCultureInfo("fr")
            .NumberFormat.NumberDecimalSeparator;
于 2013-10-10T12:21:24.120 回答
4

将不变区域性指定为格式提供者:

value.ToString(CultureInfo.InvariantCulture);
于 2013-10-10T12:21:25.513 回答