根据support#cpp17的说法,目前还没有主要厂商支持std::to_chars和std::from_chars的浮点版本。我知道正确格式化浮点数并不简单,但是C库中存在实现。但是,这些都受到环境的影响,这是将std::to_chars和std::from_chars添加到标准中的原因之一。如果您重构C库以依赖普通的低级例程来完成实际的基本转换为某种中间格式,那么这些函数的实现就不会是免费的。然后std::to_chars和std::from_chars可以或多或少地直接使用这个结果,而C和C++中更高级别的API:s (printf、atof、strtod、std::stof、std::to_string)可以做一些更奇特的事情。
发布于 2019-09-06 16:28:39
to/from_chars特性要求实现提供往返保证(自带)。具体而言,以下几点必须奏效:
float f = //get some float
char chars[LOTS_OF_CHARS];
auto result = to_chars(chars, chars + sizeof(chars), f);
float g;
from_chars(chars, result.ptr, g);
assert(f == g);这种保证实际上是很难实现的,而且标准库C或C++浮点到字符串到浮动函数都没有提供过这种保证。因此,您不能只从printf/scanf或stof/to_string获取代码,取出区域设置的内容,并将其称为to/from_chars实现。
发布于 2019-09-06 19:43:44
这是一半答案,一半问题:
我找到了一条关于提到需求的主题的讨论线索。
字符串表示由最小的字符组成,在基点(如果存在的话)之前至少有一个数字,并使用相应的std::from_chars函数解析该表示形式,精确地恢复值。
但C库不支持这一点。然而,如果措辞是至少正确往返所需的字符数,那么我猜
std::lock_guard l{local_mutex};
auto loc = setlocale(LC_ALL, nullptr);
setlocale(LC_ALL, "C");
char buffer[24]{};
sprintf(buffer, "%.17g", val); // change to 9 for float
setlocale(LC_ALL, loc);应该行得通。我说对了吗?
https://stackoverflow.com/questions/57825432
复制相似问题