summaryrefslogtreecommitdiff
path: root/src/strings.cpp
diff options
context:
space:
mode:
authorfrosch <frosch@openttd.org>2011-04-09 20:26:14 +0000
committerfrosch <frosch@openttd.org>2011-04-09 20:26:14 +0000
commit70f9a6747e6e9cd5a292f36b7f872f3ae3055906 (patch)
tree693a761f85fdf282b5291e65a1716b11d146a698 /src/strings.cpp
parent2c8b7a980f446651747e01e27152f91967a30b8c (diff)
downloadopenttd-70f9a6747e6e9cd5a292f36b7f872f3ae3055906.tar.xz
(svn r22304) -Add: {DECIMAL} string code to print decimal fractions.
Diffstat (limited to 'src/strings.cpp')
-rw-r--r--src/strings.cpp26
1 files changed, 21 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;