当前位置:  开发笔记 > 编程语言 > 正文

无论区域设置如何,如何将浮点数转换为字符串?

如何解决《无论区域设置如何,如何将浮点数转换为字符串?》经验,为你挑选了3个好方法。

我的产品面向葡萄牙观众,逗号为十进制符号.我通常使用CString :: Format将数字输入字符串,并考虑计算机的区域设置.虽然一般来说这是一个很好的方法,但我在格式化SQL查询方面遇到了问题,例如:

CString szInsert;
szInsert.Format("INSERT INTO Vertices (X, Y) VALUES (%f, %f)", pt.X, pt.Y);

当传递值时,我得到这个字符串,这是一个不正确的查询:

INSERT INTO Vertices (X, Y) VALUES (3,56, 4,67)

如何在这些字符串中强制执行点作为小数符号,而不更改区域设置,也不必为每个浮点值创建专用字符串?

注意:这是一般性问题,而不是SQL问题.



1> MSalters..:

不好的想法,你真的应该使用预备语句.使用数字进行SQL注入并不是一件容易的事,但CString :: Format并不是执行参数绑定的正确方法.

(MFC和SQL已经有一段时间了 - 结果证明这是血腥的隐藏.我开始看到我们如何最终得到SQL注入错误,感谢Microsoft.使用原始ODBC,您可以使用SQLPrepare创建一个语句(一次).通过?对于要填写的2个参数.随后,对于每个INSERT调用SQLBindParameter(stmt, 1, &X); SQLBindParameter(stmt, 2, &Y) /*extra parameters omitted, see http://msdn.microsoft.com/en-us/library/ms710963(VS.85).aspx */.最后,调用SQLExecute以执行操作.)



2> Éric Malenfa..:

关于Pukku使用ostringstream的建议的评论:为了使这与locale无关,应该明确地使用所需的语言环境灌输()流:

std::ostringstream s;
s.imbue(std::locale::classic());
s << "INSERT INTO Vertices (X, Y) VALUES (" << pt.X << ", " << pt.Y << ")";

否则,使用当前的全局区域设置.



3> Logan Capald..:

参数化查询应该完全避免这个问题.你应该看看那些.也就是说,你应该可以使用setlocale或类似的方法来改变小数分隔符.

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有