存储数据来自数据表但特定于文化

时间:2011-06-15 20:05:41

标签: c# .net datatable multilingual cultureinfo

我花了很多时间试图弄清楚C#中不同文化中的数字是如何工作的。除了向数据表添加数字之外,我已对所有方案进行了排序。在db中我有美国格式的数字(例如1.32),如果文化是德语,则在前端,它在网格中显示1,32。

我可以使用

将1.32转换为1,32
Convert.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事件中的数字,但这是一个合适的解决方案吗?应该有一种方法可以将文化特定的数字存储在数据表中。

2 个答案:

答案 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);