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