Skip to content

Commit

Permalink
Merge pull request godotengine#81328 from bruvzg/str_minus_zero
Browse files Browse the repository at this point in the history
[String] Fix string conversion for -0.0 float values.
  • Loading branch information
YuriSizov committed Sep 5, 2023
2 parents 59d3a36 + 2b3bbde commit 95b00b1
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 5 deletions.
10 changes: 5 additions & 5 deletions core/string/ustring.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1493,9 +1493,9 @@ String String::num(double p_num, int p_decimals) {

if (p_decimals < 0) {
p_decimals = 14;
const double abs_num = ABS(p_num);
const double abs_num = Math::abs(p_num);
if (abs_num > 10) {
// We want to align the digits to the above sane default, so we only
// We want to align the digits to the above reasonable default, so we only
// need to subtract log10 for numbers with a positive power of ten.
p_decimals -= (int)floor(log10(abs_num));
}
Expand Down Expand Up @@ -4890,8 +4890,8 @@ String String::sprintf(const Array &values, bool *error) const {
}

double value = values[value_index];
bool is_negative = (value < 0);
String str = String::num(ABS(value), min_decimals);
bool is_negative = signbit(value);
String str = String::num(Math::abs(value), min_decimals);
const bool is_finite = Math::is_finite(value);

// Pad decimals out.
Expand Down Expand Up @@ -4953,7 +4953,7 @@ String String::sprintf(const Array &values, bool *error) const {
String str = "(";
for (int i = 0; i < count; i++) {
double val = vec[i];
String number_str = String::num(ABS(val), min_decimals);
String number_str = String::num(Math::abs(val), min_decimals);
const bool is_finite = Math::is_finite(val);

// Pad decimals out.
Expand Down
16 changes: 16 additions & 0 deletions tests/core/string/test_string.h
Original file line number Diff line number Diff line change
Expand Up @@ -805,6 +805,22 @@ TEST_CASE("[String] sprintf") {
REQUIRE(error == false);
CHECK(output == String("fish +99.990000 frog"));

// Real with sign (negative zero).
format = "fish %+f frog";
args.clear();
args.push_back(-0.0);
output = format.sprintf(args, &error);
REQUIRE(error == false);
CHECK(output == String("fish -0.000000 frog"));

// Real with sign (positive zero).
format = "fish %+f frog";
args.clear();
args.push_back(0.0);
output = format.sprintf(args, &error);
REQUIRE(error == false);
CHECK(output == String("fish +0.000000 frog"));

// Real with 1 decimal.
format = "fish %.1f frog";
args.clear();
Expand Down

0 comments on commit 95b00b1

Please sign in to comment.