给定一个十进制值(秒及其分数)作为字符串,例如
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/