mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-13 02:52:37 +00:00
Codechange: Simplify FormatNumber by moving out zero fill and decimal support
This commit is contained in:
parent
a44bd81280
commit
fca8166087
@ -390,16 +390,12 @@ static const char *GetDecimalSeparator()
|
|||||||
* @param number the number to write down
|
* @param number the number to write down
|
||||||
* @param last the last element in the buffer
|
* @param last the last element in the buffer
|
||||||
* @param separator the thousands-separator to use
|
* @param separator the thousands-separator to use
|
||||||
* @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.
|
|
||||||
*/
|
*/
|
||||||
static void FormatNumber(StringBuilder &builder, int64_t number, const char *separator, int zerofill = 1, int fractional_digits = 0)
|
static void FormatNumber(StringBuilder &builder, int64_t number, const char *separator)
|
||||||
{
|
{
|
||||||
static const int max_digits = 20;
|
static const int max_digits = 20;
|
||||||
uint64_t divisor = 10000000000000000000ULL;
|
uint64_t divisor = 10000000000000000000ULL;
|
||||||
zerofill += fractional_digits;
|
int thousands_offset = (max_digits - 1) % 3;
|
||||||
int thousands_offset = (max_digits - fractional_digits - 1) % 3;
|
|
||||||
|
|
||||||
if (number < 0) {
|
if (number < 0) {
|
||||||
builder += '-';
|
builder += '-';
|
||||||
@ -409,39 +405,35 @@ static void FormatNumber(StringBuilder &builder, int64_t number, const char *sep
|
|||||||
uint64_t num = number;
|
uint64_t num = number;
|
||||||
uint64_t tot = 0;
|
uint64_t tot = 0;
|
||||||
for (int i = 0; i < max_digits; i++) {
|
for (int i = 0; i < max_digits; i++) {
|
||||||
if (i == max_digits - fractional_digits) {
|
|
||||||
builder += GetDecimalSeparator();
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t quot = 0;
|
uint64_t quot = 0;
|
||||||
if (num >= divisor) {
|
if (num >= divisor) {
|
||||||
quot = num / divisor;
|
quot = num / divisor;
|
||||||
num = num % divisor;
|
num = num % divisor;
|
||||||
}
|
}
|
||||||
if ((tot |= quot) || i >= max_digits - zerofill) {
|
if ((tot |= quot) || i == max_digits - 1) {
|
||||||
builder += '0' + quot; // quot is a single digit
|
builder += '0' + quot; // quot is a single digit
|
||||||
if ((i % 3) == thousands_offset && i < max_digits - 1 - fractional_digits) builder += separator;
|
if ((i % 3) == thousands_offset && i < max_digits - 1) builder += separator;
|
||||||
}
|
}
|
||||||
|
|
||||||
divisor /= 10;
|
divisor /= 10;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void FormatCommaNumber(StringBuilder &builder, int64_t number, int fractional_digits = 0)
|
static void FormatCommaNumber(StringBuilder &builder, int64_t number)
|
||||||
{
|
{
|
||||||
const char *separator = _settings_game.locale.digit_group_separator.c_str();
|
const char *separator = _settings_game.locale.digit_group_separator.c_str();
|
||||||
if (StrEmpty(separator)) separator = _langpack.langpack->digit_group_separator;
|
if (StrEmpty(separator)) separator = _langpack.langpack->digit_group_separator;
|
||||||
FormatNumber(builder, number, separator, 1, fractional_digits);
|
FormatNumber(builder, number, separator);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void FormatNoCommaNumber(StringBuilder &builder, int64_t number)
|
static void FormatNoCommaNumber(StringBuilder &builder, int64_t number)
|
||||||
{
|
{
|
||||||
FormatNumber(builder, number, "");
|
fmt::format_to(builder, "{}", number);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void FormatZerofillNumber(StringBuilder &builder, int64_t number, int count)
|
static void FormatZerofillNumber(StringBuilder &builder, int64_t number, int count)
|
||||||
{
|
{
|
||||||
FormatNumber(builder, number, "", count);
|
fmt::format_to(builder, "{:0{}d}", number, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void FormatHexNumber(StringBuilder &builder, uint64_t number)
|
static void FormatHexNumber(StringBuilder &builder, uint64_t number)
|
||||||
@ -1203,7 +1195,12 @@ static void FormatString(StringBuilder &builder, const char *str_arg, StringPara
|
|||||||
case SCC_DECIMAL: { // {DECIMAL}
|
case SCC_DECIMAL: { // {DECIMAL}
|
||||||
int64_t number = args.GetNextParameter<int64_t>();
|
int64_t number = args.GetNextParameter<int64_t>();
|
||||||
int digits = args.GetNextParameter<int>();
|
int digits = args.GetNextParameter<int>();
|
||||||
FormatCommaNumber(builder, number, digits);
|
|
||||||
|
int64_t divisor = PowerOfTen(digits);
|
||||||
|
int64_t fractional = number % divisor;
|
||||||
|
number /= divisor;
|
||||||
|
FormatCommaNumber(builder, number);
|
||||||
|
fmt::format_to(builder, "{}{:0{}d}", GetDecimalSeparator(), fractional, digits);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user