C ++의 길이가 지정된 문자열로 숫자를 변환합니다.
문제
나는 길이가 다른 숫자 (1, 999, 76492 등)를 가지고 있으며 공통 길이의 문자열로 모두 변환하려고합니다 (예 : 길이가 6 인 경우 그 문자열은 : '000001'입니다. , '000999', '076492').
다시 말해, 나는 올바른 양의 주요 0을 그 숫자에 추가해야합니다.
int n = 999;
string str = some_function(n,6);
//str = '000999'
C ++에 이와 같은 기능이 있습니까?
해결책
또는 stringstreams 사용 :
#include <sstream>
#include <iomanip>
std::stringstream ss;
ss << std::setw(10) << std::setfill('0') << i;
std::string s = ss.str();
내가 찾은 정보를 편집했습니다 arachnoid.com 나는 ioStreams의 유형 안전 방식을 좋아하기 때문입니다. 또한 다른 출력 스트림 에서이 코드를 동일하게 사용할 수 있습니다.
다른 팁
char str[7];
snprintf (str, 7, "%06d", n);
보다 snprintf
당신이 한 가지 5월 당신이 사용할 때 계속 될 수있는 잠재력 잠금이 있음을 알고 싶어합니다. stringstream
접근하다. Visual Studio 2008과 함께 제공되는 STL에는 적어도 형식 중에 다양한 로케일 정보가 사용될 때 많은 자물쇠가 꺼내고 출시됩니다. 이것은 숫자를 문자열로 동시에 변환 할 수있는 스레드 수에 따라 문제가 될 수 있습니다.
그만큼 sprintf
버전은 잠금 장치를 사용하지 않습니다 (적어도 현재 개발중인 잠금 모니터링 도구에 따르면 ...) 동시 상황에서 사용하기에 '더 나은'것일 수 있습니다.
내 도구가 최근 '로케일'잠금 장치를 서버 시스템의 잠금 장치에 가장 많은 경쟁자 중 하나라고 말하기 때문에 이것을 알아 차렸다. 그것은 약간의 놀라움으로 왔으며 내가 취한 접근 방식을 수정하게 할 수 있습니다 (즉, 다시 돌아가는 것은 sprintf
~에서 stringstream
)...
Stringstream은 할 것입니다 (XTOFL이 지적했듯이). 부스트 형식 SNPRINTF를보다 편리하게 대체합니다.
이 방법은 스트림이나 sprintf를 사용하지 않습니다. 잠금 문제가있는 것 외에도 스트림은 성능 오버 헤드가 발생하며 실제로 과잉입니다. 스트림의 경우 오버 헤드는 증기 및 스트림 버퍼를 구성해야 할 필요성에서 비롯됩니다. Sprintf의 경우 오버 헤드는 형식 문자열을 해석해야합니다. 이것은 때에도 작동합니다 N 문자열 표현이 음수입니다 N 보다 길다 렌. 이것은 가장 빠른 솔루션입니다.
inline string some_function(int n, int len)
{
string result(len--, '0');
for (int val=(n<0)?-n:n; len>=0&&val!=0; --len,val/=10)
result[len]='0'+val%10;
if (len>=0&&n<0) result[0]='-';
return result;
}
이 작업을 수행하는 방법에는 여러 가지가 있습니다. 가장 간단한 것은 다음과 같습니다.
int n = 999;
char buffer[256]; sprintf(buffer, "%06d", n);
string str(buffer);
Sprintf는 C와 같은 방법으로 C ++에서도 작동합니다.
C ++에서는 스트링 스트림과 스트림 출력 형식의 조합 (참조 http://www.arachnoid.com/cpptutor/student3.html ) 일을 할 것입니다.
이것은 오래된 실이지만 FMT 표준으로 만들 수 있습니다. 여기에 추가 솔루션이 있습니다.
#include <fmt/format.h>
int n = 999;
const auto str = fmt::format("{:0>{}}", n, 6);
주목하십시오 fmt::format("{:0>6}", n)
원하는 폭이 컴파일 시간에 알려질 때 똑같이 잘 작동합니다. 또 다른 옵션입니다 Abseil:
#include <absl/strings/str_format.h>
int n = 999;
const auto str = absl::StrFormat("%0*d", 6, n);
다시, abs::StrFormat("%06d", n)
가능합니다. 부스트 형식 이 문제의 또 다른 도구입니다.
#include <boost/format.hpp>
int n = 999;
const auto str = boost::str(boost::format("%06d") % n);
불행히도, 가변 너비 지정자는 %
연산자는 지원되지 않으므로 형식 문자열 설정이 필요합니다 (예 : const std::string fmt = "%0" + std::to_string(6) + "d";
).
성능 측면에서 Abseil과 FMT는 부스트보다 매우 매력적이고 빠르다고 주장합니다. 어쨌든 세 가지 솔루션은 모두보다 효율적이어야합니다. std::stringstream
접근 및 다른 것 외에 std::*printf
가족, 그들은 안전성을 희생하지 않습니다.