Hexfloat ('a'/'A') zero padding is placed before the sign and "0x" prefix

Cerrado Apto para principiantes
#4,971 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 9 días

@phprus ya está trabajando en esto.

Desde el 4/10/2026.

  • #4972 de @phprus — abierto

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
70/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
cpp
Área
backend

Línea de trabajo

La ruta hexfloat vive en el write() de float en include/fmt/format.h; encuentra la rama que maneja la presentación 'a'/'A' y observa cómo construye sign, '0x' y los dígitos antes de emitir mediante write_bytes en align::right. Compara con la ruta hexadecimal de enteros ("{:#012x}"), que ya inserta el padding después del prefijo. Reproduce con los tres ejemplos más fmt::sprintf, y luego ejecuta las pruebas de formato existentes. Está hecho cuando la salida coincida con printf y std::format, con ceros después de cualquier signo y el prefijo "0x".

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

With the 'a'/'A' presentation and the '0' flag, {fmt} puts the zero padding before the sign and the "0x" prefix:

fmt::format("{:012a}", 1.0) -> 0000000x1p+0
fmt::format("{:+012a}", 1.5) -> +0000x1.8p+0
fmt::format("{:012a}", -1.5) -> -0000x1.8p+0
printf("%012a", 1.0) -> 0x0000001p+0

Expected: 0x0000001p+0, +0x0001.8p+0, -0x0001.8p+0. C11 7.21.6.1 para 6 says leading zeros follow any sign or base indication, and std::format does the same. The integer path already does this right: fmt::format("{:#012x}", 0x1abc) gives 0x0000001abc. fmt::sprintf("%012a", ...) is affected too.

It looks like the hexfloat branch of the float write() in format.h builds sign + "0x" + digits and emits it with write_bytes at forced align::right, so the fill lands in front of the whole string.

fmt main @ 174569c, g++ 11.4.

I used AI tools to find and reproduce this; I reviewed it myself.

Lenguaje dominante
C++
Estrellas
25.9k
Forks
3.1k
Merge medio
9 d 5 h
PR fusionados (30 d)
13

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de fmtlib/fmt

Todos los issues de fmtlib/fmt

Issues similares

Más issues de C++

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.