1

最近的新工作,并从客户那里收到有关软件错误的问题。错误是“从字符串 '0.5' 到类型 'double' 的转换无效。”

我相信我已经找到了违规的路线。因为客户在法国并且他的计算机设置都是法语(编号系统,语言,......),所以“0.5”不能转换为“0,5”的法语数字版本法语系统没有小数他们人数的任何地方。因此,如果 string.format 看到“0.5”,它将不知道该怎么做,因为没有 '.' 在法国文化环境中被塑造成双倍的角色。我在这里吗?

context.Append(String.Format("{0} {1} exceeds fine {2} limit of {3:N0}", _
       context.OccupancyState, context.Size, _
       Reg.Alert.ToLower, context.Limit))

其中 context.Size 保存“0.5”字符串。

format.string 是否考虑了文化设置,还是我在这里遗漏了什么?

编辑:

刚刚在法语 Windows VM 上尝试过,并且(不幸的是)它能够成功地将其解析为“0,5”......所以也许这不是问题?

4

3 回答 3

2
CultureInfo culture = new CultureInfo("en-US");
context.Append(String.Format(culture, "{0} {1} exceeds fine {2} limit of {3:N0}", _
       context.OccupancyState, context.Size, _
       Reg.Alert.ToLower, context.Limit))
于 2013-02-01T22:35:49.817 回答
1

字符串格式化和解析确实考虑了计算机的文化/语言环境,因此,如果您知道所有数字都将以小数点输出并以相同格式输入,那么您将必须将不变的文化传递给格式化和解析方法。

虽然你说context.Size持有字符串“0.5”。这没有意义,因为它是第二个参数,因此将替换{1}string.Format 中的。

可能出错的是代码试图以context.Limit小数形式输出{3:N0}格式。如果字符串为“0.5”,那么这将导致法语机器(或任何带有十进制逗号的 PC)上的错误,因为这不是具有该格式的有效数字。

因此,要么将您的数字存储为数字,要么不要尝试将您已经格式化的字符串格式化为数字。

于 2013-02-01T22:37:05.197 回答
0

您需要先将字符串转换为双精度,否则String.Format只会连接字符串而不进行任何格式化。

double d = double.Parse(context.Size, CultureInfo.InvariantCulture);
string formatted = String.Format("{0} {1} exceeds fine {2} limit of {3:N0}"
                                 , context.OccupancyState, context.Size
                                 , Reg.Alert.ToLower, context.Limit);

现在string.FormatSystem.Globalization.CultureInfo.CurrentCulture在它再次将双精度格式设置为字符串时使用。

于 2013-02-01T22:34:50.467 回答