在 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"
我有一个通过 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"