- 실전
C++
프로그래밍에서는 문자열과 실수(float
,double
) 간의 변환이 자주 필요합니다. - 본 글에서는
C++
표준 라이브러리에서 제공하는 방법들 과 함께,Windows
및Linux
에서 지원하는 비표준적 방식들까지 모두 종합 하여 설명합니다. - 각 방식의 장단점과 사용 환경도 함께 정리하였습니다.
-
cpp
std::string str = "3.14"; float f = std::stof(str); double d = std::stod(str);
- 예외 처리 가능 (
std::invalid_argument
,std::out_of_range
) - 간결하지만 성능은 중간 수준
-
cpp
std::stringstream ss("2.718"); double d; ss >> d;
- 입력 실패 시 검사 필요 (
ss.fail()
) - 느리지만 직관적이며 다양한 타입 지원
-
c
char* end; float f = std::strtof("1.23", &end); double d = std::strtod("1.23", &end);
- 문자열 파싱 위치 추적 가능
- 로케일에 영향을 받음
-
cpp
std::string str = "123.456"; float f; auto result = std::from_chars(str.data(), str.data() + str.size(), f);
- 빠르고 예외를 발생시키지 않음
- 실패 여부는
result.ec
검사
-
cpp, windows
_locale_t loc = _create_locale(LC_NUMERIC, "C"); double d = _atof_l("3.14", loc);
- 명시적 로케일 지정 가능
- 로케일에 따른 파싱 정확도 확보
-
cpp, linux
locale_t loc = newlocale(LC_NUMERIC_MASK, "C", nullptr); char* end; double d = strtod_l("2.718", &end, loc);
POSIX
확장- 스레드 안전하고 다국어 환경에 적합
-
cpp
double d = 3.14159; std::string str = std::to_string(d);
- 소수점 6자리까지 출력
- 과도한 자릿수 출력 시 후처리 필요
-
cpp
std::ostringstream oss; oss << 2.71828; std::string str = oss.str();
- 포맷 제어 가능 (
std::fixed
,std::setprecision
) - 느리지만 유연함
-
cpp
char buffer[64]; std::snprintf(buffer, sizeof(buffer), "%.3f", 1.23); std::string str = buffer;
- 고정 자릿수 출력에 적합
- 플랫폼 간 일관성 높음
-
cpp
std::array<char, 64> buf; auto result = std::to_chars(buf.data(), buf.data() + buf.size(), 123.456); std::string str(buf.data(), result.ptr);
- 빠르며 예외 없음
- 출력 형식 제한적 (소수점 제어 불가)
-
cpp, windows
char buffer[64]; _gcvt(123.456, 6, buffer); // 최대 6자리까지 변환
- 포맷 자동 결정(
_gcvt
), 고정 소수점(_fcvt
) - 오래된 API지만 여전히 사용됨
-
cpp, windows
char buffer[64]; _locale_t loc = _create_locale(LC_NUMERIC, "C"); _sprintf_l(buffer, "%f", loc, 3.14);
- 로케일 기반 문자열 출력 가능
-
cpp
setlocale(LC_NUMERIC, "C"); char buffer[64]; sprintf(buffer, "%.3f", 1.23);
- 시스템 전역 로케일 변경
- 멀티스레드 환경에서는 주의 필요
-
목적 방법 플랫폼 버전 특징 문자열 → 실수 std::stof
,std::stod
전역 C++11~ 간편, 예외 처리 문자열 → 실수 std::from_chars
전역 C++17~ 빠름, 예외 없음 문자열 → 실수 std::strtod
전역 C 고전적, 위치 추적 문자열 → 실수 strtod_l
Linux glibc 로케일 지정 문자열 → 실수 _strtod_l
Windows MSVC 로케일 지정 실수 → 문자열 std::to_string
전역 C++11~ 간편, 자릿수 고정 실수 → 문자열 std::to_chars
전역 C++17~ 고속, 포맷 제한 실수 → 문자열 snprintf
,ostringstream
전역 C/C++ 유연한 포맷 실수 → 문자열 _gcvt
등Windows MSVC 포맷 자동 결정 실수 → 문자열 setlocale
+sprintf
Linux glibc 글로벌 설정 필요
-
C++17
이상을 사용하는 경우 :std::from_chars
/std::to_chars
조합은 빠르고 예외 없이 안전합니다. -
로케일 의존 파싱/출력을 할 경우 :
strtod_l
,_strtod_l
,_sprintf_l
과 같은 로케일 지정 가능한 함수들이 유리합니다. -
정밀한 포맷 제어가 필요한 경우 :
ostringstream
,snprintf
를 사용하는 것이 좋습니다. -
⚠️ setlocale
은 스레드 안전하지 않으므로 멀티스레드 환경에서는 사용 주의 가 필요합니다.
- 도움이 되셨으면 하단의 ❤️ 공감 버튼 부탁 드립니다. 감사합니다! 😄
'C C++' 카테고리의 다른 글
C++ 최소 min, 최대 max 함수 정리 (0) | 2025.04.12 |
---|---|
VTK와 OpenCV 비교: 목적에 따른 라이브러리 선택 가이드 (0) | 2025.04.08 |
QuickCppLib : 고성능 경량 C++ 유틸리티 모음 (0) | 2025.04.08 |
meojson : C++17 고성능 JSON 직렬화 라이브러리 (0) | 2025.04.06 |
cpp-ipc: 고성능 C++ 프로세스 간 통신 라이브러리 (0) | 2025.04.06 |