MCPcopy Create free account
hub / github.com/OpenTTD/OpenTTD / FormatGenericCurrency

Function FormatGenericCurrency

src/strings.cpp:590–648  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

588}
589
590static void FormatGenericCurrency(StringBuilder &builder, const CurrencySpec *spec, Money number, bool compact)
591{
592 /* We are going to make number absolute for printing, so
593 * keep this piece of data as we need it later on */
594 bool negative = number < 0;
595
596 number *= spec->rate;
597
598 /* convert from negative */
599 if (number < 0) {
600 builder.PutUtf8(SCC_PUSH_COLOUR);
601 builder.PutUtf8(SCC_RED);
602 builder.PutChar('-');
603 number = -number;
604 }
605
606 /* Add prefix part, following symbol_pos specification.
607 * Here, it can can be either 0 (prefix) or 2 (both prefix and suffix).
608 * The only remaining value is 1 (suffix), so everything that is not 1 */
609 if (spec->symbol_pos != 1) builder += spec->prefix;
610
611 StringID number_str = STR_NULL;
612
613 /* For huge numbers, compact the number. */
614 if (compact) {
615 /* Take care of the thousand rounding. Having 1 000 000 k
616 * and 1 000 M is inconsistent, so always use 1 000 M. */
617 if (number >= Money(1'000'000'000'000'000) - 500'000'000) {
618 number = (number + Money(500'000'000'000)) / Money(1'000'000'000'000);
619 number_str = STR_CURRENCY_SHORT_TERA;
620 } else if (number >= Money(1'000'000'000'000) - 500'000) {
621 number = (number + 500'000'000) / 1'000'000'000;
622 number_str = STR_CURRENCY_SHORT_GIGA;
623 } else if (number >= 1'000'000'000 - 500) {
624 number = (number + 500'000) / 1'000'000;
625 number_str = STR_CURRENCY_SHORT_MEGA;
626 } else if (number >= 1'000'000) {
627 number = (number + 500) / 1'000;
628 number_str = STR_CURRENCY_SHORT_KILO;
629 }
630 }
631
632 std::string_view separator = _settings_game.locale.digit_group_separator_currency;
633 if (separator.empty()) separator = GetCurrency().separator;
634 if (separator.empty()) separator = _langpack.langpack->digit_group_separator_currency;
635 FormatNumber(builder, number, separator);
636 if (number_str != STR_NULL) {
637 FormatString(builder, GetStringPtr(number_str), {});
638 }
639
640 /* Add suffix part, following symbol_pos specification.
641 * Here, it can can be either 1 (suffix) or 2 (both prefix and suffix).
642 * The only remaining value is 1 (prefix), so everything that is not 0 */
643 if (spec->symbol_pos != 0) builder += spec->suffix;
644
645 if (negative) {
646 builder.PutUtf8(SCC_POP_COLOUR);
647 }

Callers 1

FormatStringFunction · 0.85

Calls 6

FormatNumberFunction · 0.85
FormatStringFunction · 0.85
GetStringPtrFunction · 0.85
PutUtf8Method · 0.80
PutCharMethod · 0.80
emptyMethod · 0.45

Tested by

no test coverage detected