3

I have a C# program which uses a SQL Server database.I am already using it in a country that uses . as decimal separator. Now I want to use it in another country that uses , as decimal separator.

in C# is there some application level setting that I can change or write some code so that I can use the same database and the same program ? or do I have to change my entire code to handle this new decimal separator?

I dont know how this works.Basically I think there would be problems in My Sql Queries. example say one of my existing statements is

insert into tblproducts(productId,Price) values('A12',24.10)

now in new country it will become

insert into tblproducts(productId,Price) values('A12',24,10)

this will raise an error

so do I have to change whole code to handle this situation ?

Thank you

4

3 回答 3

1

如果您使用字符串连接构建查询,请改用参数。所以不要写:

 var query = "insert into tblproducts(productId,Price) values('" + article + "','"
    + price + ')';

使用OleDbParameters

 var query = "insert into tblproducts(productId,Price) values(?,?)"
 var cmd = new OleDbCommand(query, connection);
 cmd.Parameters.Add("@article", OleDbType.VarChar).Value = article;
 cmd.Parameters.Add("@price", OleDbType.Single).Value = price;

这将为您省去很多麻烦,包括本地化问题。

于 2008-12-09T17:46:46.557 回答
0

你可以做几件事来解决这个问题。

首先,如果您从界面中获取值,那么您将这些值转换为小数。Decimal.parse 是一个依赖于文化的函数,将使用当前文化来解析值。因此,如果 CurrentCulture 使用逗号作为小数分隔符,那么您的演员表将正常工作。然后,当您从变量输出值时,您可以指定 decimal.ToString 格式以始终使用句点作为分隔符输出。

哦,忘记补充了。您还可以更改解析以指示货币,它允许逗号和 $ 符号。例如:decimal.parse(amount, NumberStyles.Currency)

于 2008-12-09T17:44:53.847 回答
0

在 global.asax.vb 文件中,您可以设置当前页面加载的文化:

Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US")
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture

这将使所有文化感知功能都能很好地工作。例如, (5000.25).ToString() 将使用逗号与句点,具体取决于您设置的文化。此外,将用户的输入读入数字类型将根据其文化规则进行解析。日期将正确显示(12/9/08 与 9/12/08)。您基本上免费获得所有这些。

这显然会在与其他期望同一文化中的一切的系统交谈时引起问题。为了解决这个问题,您使用不变的文化编写查询:

(5000.25).ToString(CultureInfo.InvariantCulture) 

这会将输出显式设置为 Mysql 可以处理的内容。

注意:如果你有一个合适的数据层并且你将数字类型传递给它,你可能可以避免很多这样的混乱。

于 2008-12-09T17:46:19.957 回答