changeset 17540:dd2d3bc085a2 draft

(svn r22304) -Add: {DECIMAL} string code to print decimal fractions.
author frosch <frosch@openttd.org>
date Sat, 09 Apr 2011 20:26:14 +0000
parents b05872fd9c03
children 8d41eb448304
files src/strings.cpp src/table/control_codes.h src/table/strgen_tables.h
diffstat 3 files changed, 23 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/strings.cpp
+++ b/src/strings.cpp
@@ -229,14 +229,17 @@
  * @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 @@
 	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 @@
 	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 @@
 				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;
--- a/src/table/control_codes.h
+++ b/src/table/control_codes.h
@@ -72,6 +72,7 @@
 
 	SCC_STRING,
 	SCC_COMMA,
+	SCC_DECIMAL,
 	SCC_NUM,
 	SCC_ZEROFILL_NUM,
 	SCC_HEX,
--- a/src/table/strgen_tables.h
+++ b/src/table/strgen_tables.h
@@ -92,6 +92,7 @@
 
 	/* 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"