在我的数据库中,我有一个产品价格的柱子
我把它作为float
,我的问题是如果我从我的c#应用程序中保存它
作为10.50 ..在查询中它返回10,50并且如果我更新我得到一个错误
10,50无法转换为float
......或者其他类似内容..
如果我把它保存为decimal
,在sql管理中的查询..是好的..
但在我的c#应用程序中......我得到了同样的错误..
10.50重新调整为10,50我不知道为什么,以及如何解决它...我的独特解决方案是保存它
如varchar
...
答案 0 :(得分:1)
这是某种本地化问题。 10,50
是写“十分之一”的“欧洲”方式。如果您从select
语句中获取该数据,那么您的数据库可能配置不正确。
答案 1 :(得分:1)
一般来说,您应该在整个图层中使用相同的类型。因此,如果数据库中的基础类型为x
,则应在c#中传递具有相同类型的数据。
你选择什么类型取决于你所存储的内容 - 你不应该只是转换类型来获得“工作”的东西。为此,以非数字类型(例如varchar)存储数字数据将很快回来咬你。很高兴你打开这个问题来解决这个问题!
正如其他人奇迹般地推断出的那样,您可能会遇到本地化问题。这是为什么将数字存储为字符串是个问题的一个很好的例子。如果您在他们想要的任何文化/本地化中正确接受用户输入(或者您想要),并将其转换为数字类型变量,那么其余的(与数据库交谈)应该很容易。更重要的是,如果你可以帮助它,你不应该在数据库中进行数字格式化 - 这些东西更好地放在前端,更靠近用户。
答案 2 :(得分:0)
我认为你在windows区域和十进制符号语言中的设置是错误的。请将其设置为点并再次测试它。
答案 3 :(得分:0)
这可能有助于临时使用,但我不建议将其永久使用:
尝试制作它,以便在保存文件之前,将数字转换为字符串,用逗号(From,to。)替换逗号,然后将其作为字符串保存到数据库中,希望它应该看到它格式正确,并将其转换为数据库视为“十进制”或“浮动”的内容。
希望这有帮助。
答案 4 :(得分:0)
是的,本地化。
那就是说,我认为你的pice存储在SQLServer的“money”字段中(我假设它是你正在使用的SQLServer)。如果这是DB中的浮点数,它将返回正常小数点,而不是欧洲货币分隔符“,”。
修复:
除非您绝对需要浮点数,否则请在c#代码中使用不要使用FLOAT 。请改用十进制类型。这不仅仅是在这种情况下,而是在所有情况下。浮点数是二进制(base-2),而不是十进制(base-10),因此您在界面中看到的只是实际数字的十进制近似值。结果是经常(1 == 1) evaluates as false!
我自己遇到了这个问题,如果你不知道会发生什么事,那就太疯狂了。始终在c#中使用decimal
而不是float
。
好的,在您修复之后,请执行此操作以获得正确的本地化:
using System.Globalization;
...
NumberFormatInfo ni = new NumberFormatInfo();
ni.CurrencyDecimalSeparator = ",";
decimal price = decimal.Parse(dbPriceDataField, ni);
请注意,“dbPriceDataField”必须是字符串,因此您可能必须在该db resultset的字段上执行“.ToString()”。
如果您最终必须处理该货币领域的其他“金钱”方面,例如货币符号,请查看:http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.aspx
如果你需要更强大的错误处理,可以将decimal.Parse放在try / catch中,或者使用decimal.TryParse。
编辑 -
如果你知道什么文化(真的,国家),db设置为,你可以这样做:
using System.Globalization;
...
CultureInfo ci = new CultureInfo("fr-FR"); // fr-FR being "french France"
decimal price = decimal.Parse(dbprice, ci.NumberFormat);
答案 5 :(得分:0)
我的Web应用程序中遇到了这些问题...但我发现像我这样的解决方案是在文本框中获取价格值。所以我附上了数据库。因此,当您使用文本框附加数据库时...右键单击文本框并单击编辑数据绑定....您必须提供....类似于绑定属性..... {0:N2} < / p>
这仅适用于网络应用或网站...不适用于桌面应用......