문제

나는 길이가 다른 숫자 (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 가족, 그들은 안전성을 희생하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top