| 588 | } |
| 589 | |
| 590 | static 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 | } |
no test coverage detected