c++ - stof - ¿Convertir flotante a cadena con precisión y número de dígitos decimales especificados?
string to int c++ (5)
¿Cómo se convierte un flotante en una cadena en C ++ mientras se especifica la precisión y el número de dígitos decimales?
Por ejemplo:
3.14159265359 -> "3.14"
Aquí proporciono un ejemplo negativo en el que desea evitar al convertir un número flotante en cadenas.
float num=99.463;
float tmp1=round(num*1000);
float tmp2=tmp1/1000;
cout << tmp1 << " " << tmp2 << " " << to_string(tmp2) << endl;
Usted obtiene
99463 99.463 99.462997
Nota: la variable num puede ser cualquier valor cercano a 99.463, obtendrá la misma impresión. El punto es evitar la conveniente función "to_string" de c ++ 11. Me tomó un tiempo sacar esta trampa. La mejor forma es mediante los métodos stringstream y sprintf (lenguaje C). C ++ 11 o posterior debería proporcionar un segundo parámetro como el número de dígitos después del punto flotante para mostrar. En este momento, el valor predeterminado es 6. Estoy postulando esto para que otros no pierdan el tiempo en este tema.
Escribí mi primera versión, avíseme si encuentra algún error que deba corregirse. Puede controlar el comportamiento exacto con el iomanipulator. Mi función es mostrar el número de dígitos después del punto decimal.
string ftos(float f, int nd) {
ostringstream ostr;
int tens = stoi("1" + string(nd, ''0''));
ostr << round(f*tens)/tens;
return ostr.str();
}
El método habitual para hacer este tipo de cosas es "imprimir en cadena".
En C ++ eso significa usar
std::stringstream
algo como:
std::stringstream ss;
ss << std::fixed << std::setprecision(2) << number;
std::string mystring = ss.str();
Puede usar la función
fmt::format
de la
biblioteca {fmt}
:
#include <fmt/core.h>
int main()
std::string s = fmt::format("{:.2f}", 3.14159265359); // s == "3.14"
}
donde
2
es una precisión.
Esta facilidad de formateo se ha propuesto para la estandarización en C ++:
P0645
.
Tanto P0645 como {fmt} usan una sintaxis de cadena de formato similar a Python que es similar a la de
printf
pero usa
{}
como delimitadores en lugar de
%
.
Una forma típica sería usar
stringstream
:
#include <iomanip>
#include <sstream>
double pi = 3.14159265359;
std::stringstream stream;
stream << std::fixed << std::setprecision(2) << pi;
std::string s = stream.str();
Ver fixed
Usar notación de punto flotante fijo
Establece el
floatfield
formato de campofloatfield
para la secuencia str enfixed
.Cuando
floatfield
se establece enfixed
, los valores de punto flotante se escriben usando notación de punto fijo: el valor se representa con exactamente tantos dígitos en la parte decimal como se especifica en el campo deprecision
(precision
) y sin parte de exponente.
y establecer setprecision .
Para las conversiones de fines técnicos , como el almacenamiento de datos en archivos XML o JSON, C ++ 17 define la familia de funciones to_chars .
Suponiendo un compilador compatible (que nos falta al momento de escribir), se puede considerar algo como esto:
#include <array>
#include <charconv>
double pi = 3.14159265359;
std::array<char, 128> buffer;
auto [ptr, ec] = std::to_chars(buffer.data(), buffer.data() + buffer.size(), pi,
std::chars_format::fixed, 2);
if (ec == std::errc{}) {
std::string s(buffer.data(), ptr);
// ....
}
else {
// error handling
}