diff --git a/src/settings_table.cpp b/src/settings_table.cpp --- a/src/settings_table.cpp +++ b/src/settings_table.cpp @@ -50,6 +50,7 @@ #include "void_map.h" #include "station_func.h" #include "station_base.h" +#include "language.h" #include "table/strings.h" #include "table/settings.h" diff --git a/src/settings_type.h b/src/settings_type.h --- a/src/settings_type.h +++ b/src/settings_type.h @@ -222,6 +222,8 @@ struct GUISettings { bool scale_bevels; ///< bevels are scaled with GUI scale. + std::string number_format; ///< formatting string for numbers (like "thousands" grouping) + std::string number_abbreviations; ///< mapping to number formats for different powers of ten/thresholds std::string digit_decimal_separator; ///< decimal separator /** diff --git a/src/strings.cpp b/src/strings.cpp --- a/src/strings.cpp +++ b/src/strings.cpp @@ -389,8 +389,21 @@ static const char *GetDecimalSeparator() void InitializeNumberFormats() { - ParseNumberFormatSeparators(_number_format_separators, _current_language->number_format); - ParseNumberAbbreviations(_number_abbreviations, _current_language->number_abbreviations); + bool loaded_number_format = false; + if (!_settings_client.gui.number_format.empty()) { + auto res = ParseNumberFormatSeparators(_number_format_separators, _settings_client.gui.number_format); + if (res.has_value()) UserError("The setting 'number_format' under 'gui' is invalid: {}", *res); + loaded_number_format = !res.has_value(); + } + if (!loaded_number_format) ParseNumberFormatSeparators(_number_format_separators, _current_language->number_format); + + bool loaded_number_abbreviations = false; + if (!_settings_client.gui.number_abbreviations.empty()) { + auto res = ParseNumberAbbreviations(_number_abbreviations, _settings_client.gui.number_abbreviations); + if (res.has_value()) UserError("The setting 'number_abbreviations' under 'gui' is invalid: {}", *res); + loaded_number_abbreviations = !res.has_value(); + } + if (!loaded_number_abbreviations) ParseNumberAbbreviations(_number_abbreviations, _current_language->number_abbreviations); _number_abbreviations.emplace_back(0, _number_format_separators); } diff --git a/src/table/settings/gui_settings.ini b/src/table/settings/gui_settings.ini --- a/src/table/settings/gui_settings.ini +++ b/src/table/settings/gui_settings.ini @@ -16,6 +16,7 @@ static void InvalidateCompanyLiveryWindo static void InvalidateNewGRFChangeWindows(int32_t new_value); static void ZoomMinMaxChanged(int32_t new_value); static void SpriteZoomMinChanged(int32_t new_value); +void InitializeNumberFormats(); static constexpr std::initializer_list _osk_activation{"disabled", "double", "single", "immediately"}; static constexpr std::initializer_list _savegame_date{"long", "short", "iso"}; @@ -905,6 +906,24 @@ cat = SC_BASIC startup = true [SDTC_SSTR] +var = gui.number_format +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC +type = SLE_STRQ +def = nullptr +pre_cb = [](auto format) { NumberFormatSeparators separators; return !ParseNumberFormatSeparators(separators, format).has_value(); } +post_cb = [](auto) { InitializeNumberFormats(); MarkWholeScreenDirty(); } +startup = true + +[SDTC_SSTR] +var = gui.number_abbreviations +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC +type = SLE_STRQ +def = nullptr +pre_cb = [](auto format) { NumberAbbreviations abbreviations; return !ParseNumberAbbreviations(abbreviations, format).has_value(); } +post_cb = [](auto) { InitializeNumberFormats(); MarkWholeScreenDirty(); } +startup = true + +[SDTC_SSTR] var = gui.digit_decimal_separator flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC type = SLE_STRQ