1
0
mirror of https://github.com/ppy/osu.git synced 2026-05-13 20:33:35 +08:00

Fix some numeric settings not working correct in some languages when attempting to set negative value (#37667)

Closes https://github.com/ppy/osu/issues/37553.

You can probably tell by the title that this is going to be a good one.

As previously mentioned in https://github.com/ppy/osu/pull/35395,
framework-side `TextBox` uses a bunch of `NumberFormat` properties from
`CurrentCulture` to contextually allow decimal points or minus signs in
a textbox.

In some languages, namely (of the ones we support): Finnish, Croatian,
Lithuanian, Norsk, Slovenian, and Swedish, `NumberFormat.NegativeSign`
is not `U+002D HYPHEN MINUS`, but instead `U+2212 MINUS SIGN`.
Therefore, in `FormSliderBar`, when `ToStandardFormattedString()` is
attempted to be used to set the textbox value, the hardcoded `U+002D
HYPHEN MINUS` is rejected on cultures that expect `U+2212 MINUS SIGN`,
and thus due to a feedback loop, all negative values are no longer
settable.

This applies the obvious fix of applying `NumberFormat.NegativeSign`.
This commit is contained in:
Bartłomiej Dach
2026-05-08 08:45:57 +02:00
committed by GitHub
Unverified
parent 9d31332457
commit 7f5f368dea
2 changed files with 10 additions and 2 deletions
@@ -51,7 +51,15 @@ namespace osu.Game.Tests.Extensions
[TestCase(0.4, true, 2, ExpectedResult = "40%")]
[TestCase(1e-6, false, 6, ExpectedResult = "0,000001")]
[TestCase(0.48333, true, 4, ExpectedResult = "48,33%")]
public string TestCultureSensitivity(double input, bool percent, int decimalDigits)
public string TestCultureSensitivityDecimalPoint(double input, bool percent, int decimalDigits)
{
return input.ToStandardFormattedString(decimalDigits, percent);
}
[Test]
[SetCulture("sv-SE")]
[TestCase(-1e-6, false, 6, ExpectedResult = "0,000001")]
public string TestCultureSensitivityNegativeSign(double input, bool percent, int decimalDigits)
{
return input.ToStandardFormattedString(decimalDigits, percent);
}
@@ -37,7 +37,7 @@ namespace osu.Game.Extensions
return floatValue.ToString($@"0.{new string('0', Math.Max(0, significantDigits - 2))}%", CultureInfo.CurrentCulture);
}
string negativeSign = Math.Round(floatValue, significantDigits) < 0 ? "-" : string.Empty;
string negativeSign = Math.Round(floatValue, significantDigits) < 0 ? CultureInfo.CurrentCulture.NumberFormat.NegativeSign : string.Empty;
return $"{negativeSign}{Math.Abs(floatValue).ToString($"N{significantDigits}", CultureInfo.CurrentCulture)}";
}