Форматировать отрицательное целое/двойное число с помощью sprintf

возможно ли использовать только sprintf (С++) для форматирования отрицательного целого/двойного числа таким образом, чтобы между знаком и значением был пробел?

from this: -1234

to this: - 1234

Изменить: он будет идти в массиве символов.


person bevolasko    schedule 11.01.2014    source источник
comment
Чисто из любопытства, зачем вам такой формат? Форматируют ли некоторые страны отрицательные числа с пробелом перед цифрами?   -  person Bojangles    schedule 11.01.2014
comment
В документации довольно четко указано, что вы можете и чего не можете делать... cplusplus.com/ ссылка/cstdio/printf   -  person Lightness Races in Orbit    schedule 11.01.2014
comment
@Bojangles: я определенно видел отчеты, в которых начальный знак был как для положительных, так и для отрицательных чисел с выровненными знаками.   -  person Dietmar Kühl    schedule 11.01.2014
comment
Я программирую тип транслятора, который преобразует файлы g-кода, читаемые современными станками с ЧПУ, в более старый формат, который может быть прочитан более старыми машинами. Эти старые машины считывают отрицательные значения вот так.   -  person bevolasko    schedule 11.01.2014


Ответы (3)


Я понимаю, что это не вопрос, но поскольку это помечено как C++:

std::ostringstream out;
out << std::internal << std::setw(6) << -1234;
std::string result = out.str();
person Dietmar Kühl    schedule 11.01.2014

С sprintf? Не напрямую, нет.

Вам нужно будет реализовать эту логику самостоятельно (используя abs/fabs и второй аргумент sprintf) или использовать соответствующий язык для страны, в которой используется этот макет рендеринга, и надеяться, что ваша реализация соблюдает его.

Вероятно, с собственными потоками ввода-вывода C++ было бы намного проще, поэтому подумайте о переходе на них.

person Lightness Races in Orbit    schedule 11.01.2014

Попробуй это:

char large_evil_array[128];
double my_var = -12.34;
int my_int = -6589;
int chars_formatted = 
    snprintf(large_evil_array, sizeof(large_evil_array),
             "%c %5.2f %c %d\n",
              (char)((my_var < 0) ? '-' : ' '),
              (double)((my_var < 0) ? (my_var * -1.0) : my_var),
              (char)((my_int < 0) ? '-' : ' '),
              (int)((my_int < 0) ? (-1 * my_int) : my_int));

Если бы вы использовали потоки C++, вы могли бы написать свой собственный модификатор форматирования.

person Thomas Matthews    schedule 11.01.2014