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

dje*_*dot 2 c++ formatting mfc locale

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

CString szInsert;
szInsert.Format("INSERT INTO Vertices (X, Y) VALUES (%f, %f)", pt.X, pt.Y);
Run Code Online (Sandbox Code Playgroud)

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

INSERT INTO Vertices (X, Y) VALUES (3,56, 4,67)
Run Code Online (Sandbox Code Playgroud)

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

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

MSa*_*ers 10

不好的想法,你真的应该使用预备语句.使用数字进行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以执行操作.)


Éri*_*ant 9

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

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

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


Log*_*ldo 6

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