|
@@ -226,29 +226,38 @@ void InjectDParam(uint amount)
|
|
|
/**
|
|
|
* Format a number into a string.
|
|
|
* @param buff the buffer to write to
|
|
|
* @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, "-");
|
|
|
number = -number;
|
|
|
}
|
|
|
|
|
|
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;
|
|
|
num = num % divisor;
|
|
|
}
|
|
|
if (tot |= quot || i >= max_digits - zerofill) {
|
|
@@ -261,17 +270,17 @@ static char *FormatNumber(char *buff, in
|
|
|
|
|
|
*buff = '\0';
|
|
|
|
|
|
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)
|
|
|
{
|
|
|
return FormatNumber(buff, number, last, "");
|
|
|
}
|
|
@@ -994,12 +1003,19 @@ static char *FormatString(char *buff, co
|
|
|
}
|
|
|
|
|
|
case SCC_COMMA: // {COMMA}
|
|
|
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;
|
|
|
}
|
|
|
|
|
|
case SCC_PLURAL_LIST: { // {P}
|