LINUX.ORG.RU

Форматирование вывода в баш

 


0

1

Подскажите, аналог баша для такого

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
     
int  main(int argc, char *argv[])
{
    char s[1000] = "";
    unsigned long i, k;
    if (argc < 2) return 1;
    i = atol(argv[1]);
    if (i >= 1000000000000) sprintf(s, "error > 1000 000 000 000");
    else if ((k = i / 1000000000) > 0)
    {
        sprintf(s, "%lu bln", k) ; i = i - k * 1000000000;
        if ((k = i / 1000000) > 0)
       {
           sprintf(s+strlen(s), " %lu mln", k) ; i = i - k * 1000000;
       };
       if ((k = i / 1000) > 0)
       {
           sprintf(s+strlen(s), " %lu thn", k) ; i = i - k * 1000;
       };
       if (i > 0)
       {
            sprintf(s+strlen(s), " %lu", i) ;
       };
    };
     printf("%s\n",s);
     return 0;
}

суть в том, чтобы трансформировать набор цифр типа 1500600 в числа удобочитаемые типа 1,500,600.00 и так далее, кроме того надо еще расширить задачу, превращая 1500600 в 1.5 million т.е. словарная запись, можно такое реализовать БЕЗ привлечения питона и прочих языков? лишь sed \ awk \ cut \ tr \ printf ? В ответе надеюсь увидеть образец кода готового.

1500600 в числа удобочитаемые типа 1,500,600.00

$ man printf
# https://wiki-dev.bash-hackers.org/commands/builtin/printf

$ LC_NUMERIC="en_US.utf-8" printf "%'.2f\n" "123456789.12345"
123,456,789.12

С округлением

$ man numfmt

$ LC_NUMERIC="en_US.utf-8" numfmt --format="%'.2f" "123456789.12345"
123,456,789.13

превращая 1500600 в 1.5 million

$ man numfmt

$ numfmt --to=si 1500600
1.6M
Kroz ★★★★★ ()
Ответ на: комментарий от cheetah111v

У нас тоже мега идёт после кило, а гига после мега (а перед обычным идёт мили и микро). Это не обозначения названий чисел, которые не стандартизированы, а стандартизированные латинские приставки, используемые во всём мире.

«Миллиард», а тем более «Billion» — это «хз сколько, но очень много» — какое-то неизвестное число одно из двух.

Просвещайся. В серьёзном международном общении (а программы обычно предполагаются для использования без привязки к национальности) такое не годится никуда, а Приставки СИ стандантизированы и к фатальному непониманию не приведут.

anonymous ()