C ++ 11 std :: to_string (double)-후행 0 없음
오늘 저는 C ++ 11 STL의 몇 가지 새로운 기능을 시험해 보았고 std::to_string
.
사랑스럽고 멋진 기능 세트. 한 번의 double-to-string 변환을위한 stringstream 객체를 만드는 것은 항상 나에게 과잉 인 것처럼 보였으므로 이제 다음과 같이 할 수있어 기쁩니다.
std::cout << std::to_string(0.33) << std::endl;
결과?
0.330000
나는 그것에 완전히 만족하지 않습니다. std::to_string
후행 0을 생략 하는 방법이 있습니까? 나는 인터넷을 검색했지만, 내가 볼 수있는 한 함수는 오직 하나의 인자 (변환 할 값)만을 취합니다. stringstreams로 '옛날'으로 돌아 가면 스트림의 너비를 설정할 수 있지만 다시 변환하지 않을 것입니다.
누구든지 전에이 문제가 발생했거나 해결책이 있습니까? 일부 StackOverflow 검색은 아무것도 생성하지 않았습니다.
(C ++ 11 STL 참조 : http://en.cppreference.com/w/cpp/string/basic_string/to_string )
C ++ 11 표준은 다음과 같이 명시 적으로 말합니다 21.5/7
.
반환 : 각 함수는 "% d", "% u", "% ld"의 형식 지정자와 함께 sprintf (buf, fmt, val)를 호출하여 생성되는 인수 값의 문자 표현을 포함하는 문자열 객체를 반환합니다. ","% lu ","% lld ","% llu ","% f ","% f "또는"% Lf ", 여기서 buf는 충분한 크기의 내부 문자 버퍼를 지정합니다.
이 순서로 선언 된 함수의 경우 :
string to_string(int val);
string to_string(unsigned val);
string to_string(long val);
string to_string(unsigned long val);
string to_string(long long val);
string to_string(unsigned long long val);
string to_string(float val);
string to_string(double val);
string to_string(long double val);
따라서 결과 문자열의 형식을 제어 할 수 없습니다.
당신이 원하는 것은 후행 0을 제거하는 것뿐이라면 간단합니다.
std::string str = std::to_string (f);
str.erase ( str.find_last_not_of('0') + 1, std::string::npos );
std::to_string
형식을 제어 할 수 없습니다. sprintf
유형 ( "%f"
이 경우)에 대한 적절한 형식 지정자를 사용 하여 동일한 결과를 얻습니다 .
더 많은 유연성이 필요하면 더 유연한 포맷터 (예 : std::stringstream
.
std::to_string(double)
에서 생성되는 동일한 문자 시퀀스를 반환하도록 표준에 의해 정의됩니다 sprintf(buf, "%f", value)
. 더 이상도 그 이하도, 특히 형식 지정자를 조정할 방법이 없습니다. 따라서 할 수있는 일은 없습니다.
함께 boost::to_string
사용하면 형식 중 하나를 제어하지만 출력 뭔가 더 가까운 화면에서 보는 것과하지 않습니다 수 있습니다. 와 동일합니다 std::lexical_cast<std::string>
.
형식 제어가있는 함수와 유사한 작업의 경우 str(boost::format("...format...")% 0.33)
.
std :: to_string, boost :: to_string 및 boost :: lexical_cast <std :: string>의 차이점은 무엇입니까?
사용자 지정 변환 함수를 만들고 필요한 경우 꼬리 0을 제거합니다.
//! 2018.05.14 13:19:20 CST
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
//! Create a custom convert function, remove the tailing zeros if necessary.
template<typename T>
std::string tostring(const T &n) {
std::ostringstream oss;
oss << n;
string s = oss.str();
int dotpos = s.find_first_of('.');
if(dotpos!=std::string::npos){
int ipos = s.size()-1;
while(s[ipos]=='0' && ipos>dotpos){
--ipos;
}
s.erase ( ipos + 1, std::string::npos );
}
return s;
}
int main(){
std::cout<< tostring(1230)<<endl;
std::cout<< tostring(12.30)<<endl;
}
입력 번호 :
1230
12.30
로 컴파일 -std=c++11
하면 결과 :
1230
12.3
문제에 대한 다양한 솔루션이 to_string
작동하지 않기 때문 입니다. "The Magic Formula"-CS2400 선생님
std::cout.setf(ios::fixed);
std::cout.setf(ios::showpoint);
std::cout.precision(2);
const double x = 0.33, y = 42.3748;
std::cout << "$" << x << std::endl;
std::cout << "$" << y << std::endl;
출력 :
$0.33
$42.37
십진수로 수행하는 다음 출력은 그대로 설정됩니다.
당신이 적합하다고 생각하는대로 항상 setf와 정밀도를 변경할 수 있습니다.
후행 0을 생략하려면 :
std::ostringstream oss;
oss << std::setprecision(8) << std::noshowpoint << double;
std::string str = oss.str();
도움이되기를 바랍니다.
double val
std::wstringstream wss;
wss << val;
cout << wss.str().c_str();
참조 URL : https://stackoverflow.com/questions/13686482/c11-stdto-stringdouble-no-trailing-zeros
'Programing' 카테고리의 다른 글
네이티브가 아닌 바이너리의 라이브러리 종속성을 나열하는 방법은 무엇입니까? (0) | 2020.12.30 |
---|---|
git hunk 편집 모드- '-'줄을 제거하는 방법? (0) | 2020.12.30 |
방랑 할 수 없음- "공급자"설정 방법 (0) | 2020.12.30 |
람다에 사용할 수있는 NOP (no-op)에 대한 메서드 참조가 있습니까? (0) | 2020.12.30 |
JUnit5에서 Mockito를 사용하는 방법 (0) | 2020.12.29 |