在 rccp int 中保持前导零

Keep leading zero in rccp int

我有一个通过 Rcpp 反转整数的函数

#include <Rcpp.h>
using namespace Rcpp;

//' Reverse an integer
//'
//' @param x A single integer.
//' @export
// [[Rcpp::export]]
int reverse_integer(int x) {
  int reverse = 0;
  while(x != 0){
    int remainder = x%10;
    reverse = reverse*10 + remainder;
    x/=10;
  }
  return reverse;
}

这适用于没有前导或尾随零的数字

reverse_integer(123) == 321

但是,当有零时,它们将被剥离,即

reverse_integer(100) == 1

如何最好地修改此函数,以便我仍然可以将其作为整数进行运算,但又不会丢失零?

默认情况下,数字格式化程序不会打印任何前导零。

如果要保留前导零,则需要 return 字符串而不是整数。您更改函数以计算输入中尾随零的数量,并将它们添加到 returned 字符串之前。

您需要return一个字符串。 001 与任何编程语言中的 1 都不是不同的整数。方法如下:

#include <Rcpp.h>
using namespace Rcpp;

//' Reverse an integer
//'
//' @param x A single integer.
//' @export
// [[Rcpp::export]]
std::string reverse_integer(int x) {
  int reverse = 0;
  int ndigits = 0;
  while(x != 0){
    int remainder = x%10;
    reverse = reverse*10 + remainder;
    x/=10;
    ndigits++;
  }
  std::string output(ndigits, '[=10=]');
  char * outputp = &output[0];
  std::string fmt_string = "%0" + std::to_string(ndigits) + "d";
  sprintf(outputp, fmt_string.c_str(), reverse);
  return output;
}

示例:

reverse_integer(103400)
[1] "004301"