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 ? В ответе надеюсь увидеть образец кода готового.

В ответе надеюсь увидеть образец кода готового.

А поговорить?

Deleted
()

В ответе надеюсь увидеть образец кода готового

Вроде же не в Job заходил. Надеюсь тему переместят куда полагается.

anonymous
()

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 ★★★★★
()

В ответе надеюсь увидеть образец кода готового.

ОК. 15 т.р.

IPR ★★★★★
()
Ответ на: комментарий от Kroz

Вот жеж! Спасибо. Никто не мог мне до сей поры сказать про numfmt

cheetah111v
() автор топика
Ответ на: комментарий от Kroz

Только вопрос, почему numfmt --to=si для числа 34422195144 выдает G, когда это Billion, т.е. буква Bi должна быть, или я чё не понимаю? И почему numfmt не может схавать такое число 34422195144.3 ?

cheetah111v
() автор топика
Ответ на: комментарий от cheetah111v
$ LC_ALL=C numfmt --to=si 1221435543534.12
1.3T
anonymous
()
Ответ на: комментарий от cheetah111v

si это не million и billion, а kilo, mega, giga, tera, и т.д. Но уж дальше из буквы в своё «Billion» ты уж и сам осилишь перевести — хоть sed'ом.

anonymous
()
Ответ на: комментарий от cheetah111v

Десятичные приставки СИ. Они стандартизированны. А billion наоброт, разный в штатах и в нормальных местах.

legolegs ★★★★★
()
Ответ на: комментарий от cheetah111v

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

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

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.