C++ 将十进制字符串拆分为两个整数

标签 c++ string converters

给定一个十进制值(秒及其分数)作为字符串,例如

std::string span = "ssss.nnnn"  // ssss is value in seconds, nnnn is fractional seconds

将其转换为 timeval 结构(val.ts_sec 和 val.ts_usec)或 timespec 结构(tv_sec 和 tv_nsec)的最佳方法是什么。

大多数答案都讨论了转换值或者不是 C++。有些答案变得非常复杂,或者设置的类对于这种用法来说实在是太多了。

显然,如果两个值由空格分隔,则可以使用 sscanf 或 istringstream。但是,如果它们由“.”分隔,是否有一种简单的方法可以做到这一点?无需遍历字符缓冲区搜索“。”

最佳答案

编辑:正如 Borgleader 正确提到的那样,如果时间戳变得足够大(大于一百万,给予或接受),简单地读入 double 会导致精度损失。一种数值稳定的方式是

timeval v;
time_t seconds;
double fraction;

std::istringstream parser(span);

if(parser >> seconds >> std::noskipws >> fraction) {
  v.tv_sec  = seconds;
  v.tv_usec = static_cast<suseconds_t>(fraction * 1e6);
}

从现在开始,fraction 部分保证足够小,因此 ieee-754 double 的尾数将覆盖逗号后超过 9 个十进制数字。一种可能的添加是

  v.tv_usec = static_cast<suseconds_t>(fraction * 1e6 + 0.5); // rounding to nearest instead of down

取决于您的用例。

关于C++ 将十进制字符串拆分为两个整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27863827/

相关文章:

c++ - Delphi 和 C++ 结构

c++ - 有没有办法使用 SWIG 将不同的数组类型从 python 传递到 c++?

java - 在 [ 和 ] 之间分割

pdf - Ghostscript:如何将 EPS 转换为具有相同页面大小的 PDF

c++ - "String subscript out of range"使用 vector 时出错

c++ - 互斥和进程同步; C++

c++ - 需要有关反转输入的递归程序的帮助

r - 拆分字符串、标记子字符串并将标记转换为数字向量

c# - 文档到 .jpg 转换器

JavaScript - 以干净的方式将字节转换为 float