From 70f9a6747e6e9cd5a292f36b7f872f3ae3055906 Mon Sep 17 00:00:00 2001 From: frosch Date: Sat, 9 Apr 2011 20:26:14 +0000 Subject: (svn r22304) -Add: {DECIMAL} string code to print decimal fractions. --- src/strings.cpp | 26 +++++++++++++++++++++----- src/table/control_codes.h | 1 + src/table/strgen_tables.h | 1 + 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/strings.cpp b/src/strings.cpp index 2ac57eb83..edcfbb53a 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -229,14 +229,17 @@ void InjectDParam(uint amount) * @param number the number to write down * @param last the last element in the buffer * @param separator the thousands-separator to use - * @param zerofill minimum number of digits to print. The number will be filled with zeros at the front if necessary. + * @param zerofill minimum number of digits to print for the integer part. The number will be filled with zeros at the front if necessary. + * @param fractional_digits number of fractional digits to display after a decimal separator. The decimal separator is inserted + * in front of the \a fractional_digits last digit of \a number. * @return till where we wrote */ -static char *FormatNumber(char *buff, int64 number, const char *last, const char *separator, int zerofill = 1) +static char *FormatNumber(char *buff, int64 number, const char *last, const char *separator, int zerofill = 1, int fractional_digits = 0) { static const int max_digits = 20; uint64 divisor = 10000000000000000000ULL; - int thousands_offset = (max_digits - 1) % 3; + zerofill += fractional_digits; + int thousands_offset = (max_digits - fractional_digits - 1) % 3; if (number < 0) { buff += seprintf(buff, last, "-"); @@ -246,6 +249,12 @@ static char *FormatNumber(char *buff, int64 number, const char *last, const char uint64 num = number; uint64 tot = 0; for (int i = 0; i < max_digits; i++) { + if (i == max_digits - fractional_digits) { + const char *decimal_separator = _settings_game.locale.digit_decimal_separator; + if (decimal_separator == NULL) decimal_separator = _langpack->digit_decimal_separator; + buff += seprintf(buff, last, "%s", decimal_separator); + } + uint64 quot = 0; if (num >= divisor) { quot = num / divisor; @@ -264,11 +273,11 @@ static char *FormatNumber(char *buff, int64 number, const char *last, const char return buff; } -static char *FormatCommaNumber(char *buff, int64 number, const char *last) +static char *FormatCommaNumber(char *buff, int64 number, const char *last, int fractional_digits = 0) { const char *separator = _settings_game.locale.digit_group_separator; if (separator == NULL) separator = _langpack->digit_group_separator; - return FormatNumber(buff, number, last, separator); + return FormatNumber(buff, number, last, separator, 1, fractional_digits); } static char *FormatNoCommaNumber(char *buff, int64 number, const char *last) @@ -997,6 +1006,13 @@ static char *FormatString(char *buff, const char *str_arg, StringParameters *arg buff = FormatCommaNumber(buff, args->GetInt64(SCC_COMMA), last); break; + case SCC_DECIMAL: {// {DECIMAL} + int64 number = args->GetInt64(SCC_DECIMAL); + int digits = args->GetInt32(SCC_DECIMAL); + buff = FormatCommaNumber(buff, number, last, digits); + break; + } + case SCC_ARG_INDEX: { // Move argument pointer args->offset = orig_offset + (byte)*str++; break; diff --git a/src/table/control_codes.h b/src/table/control_codes.h index ccebcc864..73d4a2b91 100644 --- a/src/table/control_codes.h +++ b/src/table/control_codes.h @@ -72,6 +72,7 @@ enum StringControlCode { SCC_STRING, SCC_COMMA, + SCC_DECIMAL, SCC_NUM, SCC_ZEROFILL_NUM, SCC_HEX, diff --git a/src/table/strgen_tables.h b/src/table/strgen_tables.h index ecc3bbedd..9979b10f3 100644 --- a/src/table/strgen_tables.h +++ b/src/table/strgen_tables.h @@ -92,6 +92,7 @@ static const CmdStruct _cmd_structs[] = { /* Numbers */ {"COMMA", EmitSingleChar, SCC_COMMA, 1, C_NONE}, // Number with comma + {"DECIMAL", EmitSingleChar, SCC_DECIMAL, 2, C_NONE}, // Number with comma and fractional part. Second parameter is number of fractional digits, first parameter is number times 10**(second parameter). {"NUM", EmitSingleChar, SCC_NUM, 1, C_NONE}, // Signed number {"ZEROFILL_NUM", EmitSingleChar, SCC_ZEROFILL_NUM, 2, C_NONE}, // Unsigned number with zero fill, e.g. "02". First parameter is number, second minimum length {"BYTES", EmitSingleChar, SCC_BYTES, 1, C_NONE}, // Unsigned number with "bytes", i.e. "1.02 MiB or 123 KiB" -- cgit v1.2.3-70-g09d2