在数据表中存储编号,但特定于区域性

本文关键字:区域性 数据表 存储 编号 | 更新日期: 2023-09-27 17:59:26

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

我可以使用 1.32 转换为 1,32

Convert.ToDouble("1.32").ToString(Culture.GetCultureInfo("de-DE"))

但是当我将其添加到双精度类型的列中的数据表中时,它变成了 132.0。

DB 中的数字为双精度类型。这就是我尝试将其转换为适当的文化格式的方式:

dt.Rows.Add(new Object[] { Convert.ToDecimal(ds.Tables[0].Rows[i][5]).ToString(culture.NumberFormat) })

一种方法是在网格的行数据绑定事件中格式化数字,但这是正确的解决方案吗?应该有一种方法可以在数据表中存储区域性特定的数字。

在数据表中存储编号,但特定于区域性

当您将值保存到数据库/数据表时,它应该是双精度而不是字符串的类型。双精度值不关心格式,仅当它被转换(和显示(为字符串时。

至于格式设置,GridView 使用 CultureInfo.CurrentCulture 中指定的区域性(可以从代码更改(。但您也可以使用属性 DataFormatString 在 BoundField 上设置特定的格式

如果您尝试将字符串添加到双精度类型的 DataTable 字段,将使用 CultureInfo.CurrentCulture 对其进行解析 - 在您的情况下,该字段可能具有句点作为小数分隔符。

应将双精度值直接添加到数据表中,而不是将其格式化为不同区域性 (de-DE( 中的字符串:

dataTable.Rows.Add(..., Convert.ToDouble("1.32"), ...);

而不是:

dataTable.Rows.Add(..., Convert.ToDouble("1.32").ToString(anotherCulture), ...);

随后,您可以更改用于显示 DataTable 中的值的区域性 - 如何执行此操作取决于您的显示方式,但一种方法是:

((double) dataRow["MyDoubleColumn"]).ToString(anotherCulture);