C++ 不使用 iomanip 实现小数点对齐:3 位小数输出及代码示例
C++ 中不使用 iomanip 实现小数点对齐
在 C++ 编程中,我们经常需要格式化输出数值,例如保留特定位数的小数并进行小数点对齐。虽然 iomanip 库提供了便捷的工具,但有时我们可能希望避免使用它,而是通过手动处理字符串来实现相同的效果。
以下是不使用 iomanip 库,实现保留 3 位小数和上下行小数点对齐的 C++ 代码示例:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
// 将浮点数转换为字符串,保留指定位数的小数
string formatNumber(double number, int decimalPlaces) {
ostringstream oss;
oss.precision(decimalPlaces);
oss << fixed << number;
return oss.str();
}
int main() {
const int MAX_VALUES = 5; // 可修改为需要输入的数值数量
double values[MAX_VALUES];
// 输入数值
cout << '请输入 ' << MAX_VALUES << ' 个数值:' << endl;
for (int i = 0; i < MAX_VALUES; i++) {
cin >> values[i];
}
// 找到最大的小数位数
int maxDecimalPlaces = 0;
for (int i = 0; i < MAX_VALUES; i++) {
double integerPart;
double decimalPart = modf(values[i], &integerPart);
int decimalPlaces = 0;
while (decimalPart > 0.001) {
decimalPart *= 10;
decimalPart = modf(decimalPart, &integerPart);
decimalPlaces++;
}
if (decimalPlaces > maxDecimalPlaces) {
maxDecimalPlaces = decimalPlaces;
}
}
// 输出数值并进行上下行小数点对齐
cout << '输出结果:' << endl;
for (int i = 0; i < MAX_VALUES; i++) {
// 将数值转换为字符串,并保留3位小数
string formattedNumber = formatNumber(values[i], 3);
// 计算当前数值的小数位数
double integerPart;
double decimalPart = modf(values[i], &integerPart);
int decimalPlaces = 0;
while (decimalPart > 0.001) {
decimalPart *= 10;
decimalPart = modf(decimalPart, &integerPart);
decimalPlaces++;
}
// 根据最大小数位数进行对齐
string padding(maxDecimalPlaces - decimalPlaces, ' ');
cout << padding << formattedNumber << endl;
}
return 0;
}
代码说明:
-
formatNumber函数:- 接收一个浮点数和要保留的小数位数作为参数。
- 使用
ostringstream将浮点数转换为字符串,并使用precision和fixed控制小数位数。 - 返回格式化后的字符串。
-
主函数:
- 接收用户输入的多个浮点数。
- 找到所有输入值中最大的小数位数,用于后续对齐。
- 遍历每个输入值,使用
formatNumber函数将其格式化为保留 3 位小数的字符串。 - 根据最大小数位数,计算需要填充的空格数,并使用字符串填充实现小数点对齐。
- 最后,输出格式化后的数值。
这段代码展示了如何使用字符串处理技巧来实现 C++ 中的小数点对齐,避免了对 iomanip 库的依赖。通过自定义格式化函数和字符串填充,我们可以灵活地控制数值的输出格式,满足不同的需求。
原文地址: https://www.cveoy.top/t/topic/kjQ 著作权归作者所有。请勿转载和采集!