Search code examples
c++rrcpp

Keep leading zero in rccp int


I have a function via Rcpp that reverses an integer

#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;
}

This works fine for numbers without leading or trailing zeroes

reverse_integer(123) == 321

However, when there are zeroes, they will get stripped, i.e.,

reverse_integer(100) == 1

How can I best modify this function so I can still operate on it as an integer, but without losing zeroes?


Solution

  • You need to return a string. 001 is not a different integer than 1 in any programming language. Here's how:

    #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, '\0');
      char * outputp = &output[0];
      std::string fmt_string = "%0" + std::to_string(ndigits) + "d";
      sprintf(outputp, fmt_string.c_str(), reverse);
      return output;
    }
    

    Example:

    reverse_integer(103400)
    [1] "004301"