sprintf改变数字格式

时间:2011-10-12 16:06:30

标签: php printf

我遇到sprintf()的问题,使用它将一个mysql查询存储到var中以便以后使用它。

告知,我正在使用adodb库进行数据库相关操作。

例如$value=25.5$id=5,我有类似

的内容
$value = number_format($baseValue, 2, ".", "");

$query = sprintf("Insert into table_name (id, value) values (%d, $.02f)", $id, $value);
$db->Execute($query);

之前有一个条件决定在此之前是否还有另一个$查询。如果第一个查询没有运行,那么这个查询

运行正常
Insert into table_name (id, value) values (5, 25.50)

但如果第一个查询运行,那么我在这个查询上会出错,因为查询结果为

Insert into table_name (id, value) values (5, 25,50)

我试图在$value之前打印sprintf()并且它仍然具有正确的格式,为什么发生这种情况以及如何解决?

修改:直到此时才使用或更改$ value

2 个答案:

答案 0 :(得分:1)

你基本上做了两次字符串转换的等效数字,首先是number_format(),然后是printf()%f修饰符。用$.02f替换%s就足够了。

printf()未生成有效的英文格式编号的原因是因为它使用了区域设置(有关详细信息,请参阅setlocale())。鉴于SQL期望固定格式,使用number_format()更可靠。

更新: ADOdb library似乎支持准备好的状态。它们通常比将值注入SQL代码更简单,更健壮:

$rs = $DB->Execute("select * from table where key=?",array($key));
while (!$rs->EOF) {
    print_r($rs->fields);
    $rs->MoveNext();
}

答案 1 :(得分:0)

在您的值周围添加一些单引号。 25,50将被解释为两个字段,一开始(我非常确定mySQL不会像25.50那样没有引号。

$query = sprintf("Insert into table_name (id, value) values ('%d', '$.02f')", $id, $value);

将导致:

Insert into table_name (id, value) values ('5', '25.50')