From b7d835d9cae8625fe32fa837bae6f3e7843f50e7 Mon Sep 17 00:00:00 2001 From: Maganty Rushyendra Date: Wed, 3 Jun 2020 19:47:47 +0800 Subject: [PATCH] Enable zero padding with float specifier for format strings Godot currently supports zero padding for integers, octals and hexadecimals when using format strings, but not for floats. This commit adds support for zero padding for floats, thus ensuring consistent behavior for all types, and making Godot's format specifiers' behavior closer to c's `printf()`. Before: `print("<%07.2f>" % -0.2345)` prints `< -0.23>`. Now: `print("<%07.2f>" % -0.2345)` prints `<-000.23>`. `print("<%7.2f>" % -0.2345)` prints `< -0.23>`. --- core/ustring.cpp | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/core/ustring.cpp b/core/ustring.cpp index cfb547742a5..079f18d202a 100644 --- a/core/ustring.cpp +++ b/core/ustring.cpp @@ -4143,27 +4143,40 @@ String String::sprintf(const Array &values, bool *error) const { } double value = values[value_index]; - String str = String::num(value, min_decimals); + bool is_negative = (value < 0); + String str = String::num(abs(value), min_decimals); // Pad decimals out. str = str.pad_decimals(min_decimals); - // Show sign - if (show_sign && str.left(1) != "-") { - str = str.insert(0, "+"); + int initial_len = str.length(); + + // Padding. Leave room for sign later if required. + int pad_chars_count = (is_negative || show_sign) ? min_chars - 1 : min_chars; + String pad_char = pad_with_zeroes ? String("0") : String(" "); + if (left_justified) { + if (pad_with_zeroes) { + return "left justification cannot be used with zeros as the padding"; + } else { + str = str.rpad(pad_chars_count, pad_char); + } + } else { + str = str.lpad(pad_chars_count, pad_char); } - // Padding - if (left_justified) { - str = str.rpad(min_chars); - } else { - str = str.lpad(min_chars); + // Add sign if needed. + if (show_sign || is_negative) { + String sign_char = is_negative ? "-" : "+"; + if (left_justified) { + str = str.insert(0, sign_char); + } else { + str = str.insert(pad_with_zeroes ? 0 : str.length() - initial_len, sign_char); + } } formatted += str; ++value_index; in_format = false; - break; } case 's': { // String