openlang

итоговая сумма выводит склеенные цифры, а не сумму

Строки по дням в порядке (12500, 3400, 900 won), а вот TOTAL выводит 0125003400900 KRW. Откуда лишний ноль?

const grand = rows.reduce((acc, r) => acc + r.cents, 0);
console.log(`TOTAL ${won(grand)}`);

tsc проходит, Postgres 16 в docker. Тот же reduce, что и всегда...

Переведено с английскогоПоказать оригинал

Разговор продолжается 10

Следуя доводам
  1. Ссылка на ответ

    да, почти наверняка дело в этом, 0125003400900 это просто склеенные строки, pg отдаёт bigint и numeric строками. Либо Number(r.cents) в reduce, либо приведение в запросе через cents::int, если значения влезают. Если могут быть большие, используйте BigInt и форматируйте в самом конце.

    Переведено с английскогоПоказать оригинал
  2. Ссылка на ответ

    Всё в порядке, ваш итог просто очень честный. Postgres присылает текст, JavaScript его склеивает. Бухгалтерия через конкатенацию строк, а tsc говорит «выглядит нормально». Ещё бы.

    Переведено с английскогоПоказать оригинал
  3. Ссылка на ответ

    Одна оговорка насчёт cents::int: если суммировать в SQL, результат снова будет строкой. sum(int) возвращает bigint, а sum(bigint) возвращает numeric, и драйвер отдаёт оба как текст. Так что Number() всё равно нужен, только один раз в конце, а не на каждую строку.

    Суммировать в запросе всё равно лучше, база делает это за один проход. Типы возвращаемых значений агрегатов описаны в документации Postgres по агрегатам.

    Переведено с английскогоПоказать оригинал
  4. Ссылка на ответ

    Забавно, что строки по дням выглядели нормально, потому что won() форматирует строку "12500" так же, как число. Только + всё выдал. А лишний ноль спереди это просто мой начальный 0, ставший текстом. На странице MDN про оператор сложения всё прямо сказано: если хотя бы одна сторона строка, происходит конкатенация. Я это знал, но не в reduce...

    Переведено с английскогоПоказать оригинал

Другие стороны того же вопроса

  1. rows.Next вернул false, а ошибка потерялась

    Маленькая утилита на database/sql вернула половину списка. Без ошибки. Код такой. Контекст с дедлайном. Дедлайн истёк посреди…

    Ответы 3Последняя активность sqlgo
  2. Частичный индекс и параметр в условии WHERE

    Пишу небольшой job runner на Go для учебного проекта. Стек: pgx v5 через database/sql, локально Postgres 16, таблица jobs при…

    Ответы 10Последняя активность sqlgo
  3. Очередь на SKIP LOCKED и воркер, умерший посреди транзакции

    Очередь задач прямо в таблице. Один воркер на Python, второй на Go. BEGIN, потом SELECT id, payload FROM jobs WHERE status =…

    Ответы 5Последняя активность sqlgo