2010-03-19 30 views
1

我需要打印兼作以下规则:如何实现以下C++输出格式?

1) No scietific notation 
2) Maximum decimal point is 3 
3) No trailing 0. 

例如:

0.01  formated to "0.01" 
2.123411 formatted to "2.123" 
2.11  formatted to "2.11" 
2.1   formatted to "2.1" 
0   formatted to "0" 

通过使用.precision(3)和std ::固定的,我只能实现规则1)和规则2),但不排除3)

0.01  formated to "0.010" 
2.123411 formatted to "2.123" 
2.11  formatted to "2.110" 
2.1   formatted to "2.100" 
0   formatted to "0" 

代码示例波纹管:

#include <iostream> 

int main() { 
    std::cout.precision(3); 
    std::cout << std::fixed << 0.01 << std::endl; 
    std::cout << std::fixed << 2.123411 << std::endl; 
    std::cout << std::fixed << 2.11 << std::endl; 
    std::cout << std::fixed << 2.1 << std::endl; 
    std::cout << std::fixed << 0 << std::endl; 
    getchar(); 
} 

有什么想法吗?

+0

的三个规则的组合? – dirkgently 2010-03-19 07:37:20

回答

2

你不能用iostream库的内置格式来做到这一点。

此外,您不需要在每个输出上应用固定,因为它未被重置。

您可以编写自己的手做:

struct MyFormatter { 
    int precision; 
    double value; 
    MyFormatter(int precision, double value) : precision(precision), value(value) {} 
    friend std::ostream& operator<<(std::ostream& s, MyFormatter const& v) { 
    std::stringstream ss; 
    ss << std::set_precision(v.precision) << std::fixed << v.value; 
    std::string str; 
    ss.str().swap(str); 
    str.resize(str.find_last_not_of("0") + 1); 
    if (str[str.length() - 1] == '.') str.resize(str.length() - 1); 
    s << str; 
    return s; 
    } 
}; 

struct MyFormat { 
    int precision; 
    MyFormat(int precision) : precision(precision) {} 
    MyFormatter operator()(double value) const { 
    return MyFormatter(precision, value); 
    } 
}; 

int main() { 
    MyFormat f(3); 
    std::cout << f(0) << ' ' << f(0.1) << ' ' << f(0.12345) << '\n'; 
    return 0; 
} 
1

对于#3,你需要编写自己的操纵器去除尾随零。这没有内置的操纵器。