String.format()必须声明文化不变性吗?

时间:2013-02-01 22:29:57

标签: .net casting cultureinfo

最近新工作,并从客户那里得到有关软件错误的问题。错误是“从字符串'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”...所以也许这不是问题?

3 个答案:

答案 0 :(得分: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))

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

您需要先将字符串转换为double,否则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.Format将再次将double格式化为字符串时将使用System.Globalization.CultureInfo.CurrentCulture