2
0
Эх сурвалжийг харах

Merge pull request #39261 from mrushyendra/string_padding

Enable zero padding with float specifier for format strings
Rémi Verschelde 5 жил өмнө
parent
commit
786fc63faa
1 өөрчлөгдсөн 22 нэмэгдсэн , 9 устгасан
  1. 22 9
      core/ustring.cpp

+ 22 - 9
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
+					// 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) {
-						str = str.rpad(min_chars);
+						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(min_chars);
+						str = str.lpad(pad_chars_count, pad_char);
+					}
+
+					// 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