我花了很多时间试图弄清楚C#中不同文化中的数字是如何工作的。除了向数据表添加数字之外,我已对所有方案进行了排序。在db中我有美国格式的数字(例如1.32),如果文化是德语,则在前端,它在网格中显示1,32。
我可以使用
将1.32转换为1,32Convert.ToDouble("1.32").ToString(Culture.GetCultureInfo("de-DE"))
但是当我将它添加到double类型的列中的数据表中时,它变为132.0。
db中的数字是double类型。这就是我尝试将其转换为适当的文化格式的方式:
dt.Rows.Add(new Object[] { Convert.ToDecimal(ds.Tables[0].Rows[i][5]).ToString(culture.NumberFormat) })
一种方法是格式化网格的rowdatabound事件中的数字,但这是一个合适的解决方案吗?应该有一种方法可以将文化特定的数字存储在数据表中。
答案 0 :(得分:1)
将值保存到数据库/数据表时,它应该是double而不是string类型。仅当将值转换(并显示)为字符串时,double值不关心格式化。
至于格式化,GridView使用CultureInfo.CurrentCulture中指定的区域性(可以从代码中更改)。但您也可以使用属性DataFormatString
在BoundField上设置特定格式答案 1 :(得分:1)
如果您尝试将字符串添加到double类型的DataTable字段,它将使用CultureInfo.CurrentCulture
进行解析 - 在您的情况下可能会将句点作为小数点分隔符。
您应该将double直接添加到DataTable,而不是将其格式化为不同文化中的字符串(de-DE):
dataTable.Rows.Add(..., Convert.ToDouble("1.32"), ...);
而不是:
dataTable.Rows.Add(..., Convert.ToDouble("1.32").ToString(anotherCulture), ...);
随后您可以更改用于显示DataTable值的文化 - 您如何执行此操作取决于您的显示方式,但有一种方法是:
((double) dataRow["MyDoubleColumn"]).ToString(anotherCulture);