diff --git a/Source/Editor/Options/InterfaceOptions.cs b/Source/Editor/Options/InterfaceOptions.cs
index 5c4a88b1e..3e32b0933 100644
--- a/Source/Editor/Options/InterfaceOptions.cs
+++ b/Source/Editor/Options/InterfaceOptions.cs
@@ -185,6 +185,21 @@ namespace FlaxEditor.Options
}
}
+ private bool _spaceNumberAndUnits = false;
+
+ ///
+ /// Gets or sets the option to put a space between numbers and units for unit formatting
+ ///
+ [DefaultValue(false)]
+ [EditorDisplay("Interface"), EditorOrder(310), Tooltip("Put a space between numbers and units.")]
+ public bool SpaceNumberAndUnits { get => _spaceNumberAndUnits;
+ set
+ {
+ _spaceNumberAndUnits = value;
+ Units.SpaceNumberAndUnits = _spaceNumberAndUnits;
+ }
+ }
+
///
/// Gets or sets the timestamps prefix mode for output log messages.
///
diff --git a/Source/Editor/Utilities/Units.cs b/Source/Editor/Utilities/Units.cs
index 1256ccd63..cd4e67882 100644
--- a/Source/Editor/Utilities/Units.cs
+++ b/Source/Editor/Utilities/Units.cs
@@ -7,15 +7,30 @@ public class Units
///
public static readonly float Meters2Units = 100f;
- // the next two bools could be cached values in the user preferences
-
///
- /// Set it to false to always show game units without any postfix
+ /// Set it to false to always show game units without any postfix.
///
public static bool UseUnitsFormatting = true;
///
- /// If set to true, the distance unit is chosen on the magnitude, otherwise it's meters
+ /// Add a space between numbers and units for readability.
+ ///
+ public static bool SpaceNumberAndUnits = true;
+
+ ///
+ /// If set to true, the distance unit is chosen on the magnitude, otherwise it's meters.
///
public static bool AutomaticUnitsFormatting = true;
+
+ ///
+ /// Return the unit according to user settings.
+ ///
+ ///
+ ///
+ public static string Unit(string unit)
+ {
+ if (SpaceNumberAndUnits)
+ return $" {unit}";
+ return unit;
+ }
}
diff --git a/Source/Editor/Utilities/Utils.cs b/Source/Editor/Utilities/Utils.cs
index 445520f76..17456babf 100644
--- a/Source/Editor/Utilities/Utils.cs
+++ b/Source/Editor/Utilities/Utils.cs
@@ -1171,6 +1171,36 @@ namespace FlaxEditor.Utilities
return StringUtils.GetPathWithoutExtension(path);
}
+ private static string InternalFormat(double value, string format, FlaxEngine.Utils.ValueCategory category)
+ {
+ switch (category)
+ {
+ case FlaxEngine.Utils.ValueCategory.Distance:
+ if (!Units.AutomaticUnitsFormatting)
+ return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("m");
+ var absValue = Mathf.Abs(value);
+ // in case a unit != cm this would be (value / Meters2Units * 100)
+ if (absValue < Units.Meters2Units)
+ return value.ToString(format, CultureInfo.InvariantCulture) + Units.Unit("cm");
+ if (absValue < Units.Meters2Units * 1000)
+ return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("m");
+ return (value / 1000 / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("km");
+ case FlaxEngine.Utils.ValueCategory.Angle: return value.ToString(format, CultureInfo.InvariantCulture) + "°";
+ case FlaxEngine.Utils.ValueCategory.Time: return value.ToString(format, CultureInfo.InvariantCulture) + Units.Unit("s");
+ // some fonts have a symbol for that: "\u33A7"
+ case FlaxEngine.Utils.ValueCategory.Speed: return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("m/s");
+ case FlaxEngine.Utils.ValueCategory.Acceleration: return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("m/s²");
+ case FlaxEngine.Utils.ValueCategory.Area: return (value / Units.Meters2Units / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("m²");
+ case FlaxEngine.Utils.ValueCategory.Volume: return (value / Units.Meters2Units / Units.Meters2Units / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("m³");
+ case FlaxEngine.Utils.ValueCategory.Mass: return value.ToString(format, CultureInfo.InvariantCulture) + Units.Unit("kg");
+ case FlaxEngine.Utils.ValueCategory.Force: return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("N");
+ case FlaxEngine.Utils.ValueCategory.Torque: return (value / Units.Meters2Units / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + Units.Unit("Nm");
+ case FlaxEngine.Utils.ValueCategory.None:
+ default:
+ return FormatFloat(value);
+ }
+ }
+
///
/// Format a float value either as-is, with a distance unit or with a degree sign
///
@@ -1183,35 +1213,10 @@ namespace FlaxEditor.Utilities
return "Infinity";
if (float.IsNegativeInfinity(value) || value == float.MinValue)
return "-Infinity";
- const string format = "g7";
- if (!Units.UseUnitsFormatting)
+ if (!Units.UseUnitsFormatting || category == FlaxEngine.Utils.ValueCategory.None)
return FormatFloat(value);
- switch (category)
- {
- case FlaxEngine.Utils.ValueCategory.Distance:
- if (!Units.AutomaticUnitsFormatting)
- return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m";
- var absValue = Mathf.Abs(value);
- // in case a unit != cm this would be (value / Meters2Units * 100)
- if (absValue < Units.Meters2Units)
- return value.ToString(format, CultureInfo.InvariantCulture) + "cm";
- if (absValue < Units.Meters2Units * 1000)
- return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m";
- return (value / 1000 / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "km";
- case FlaxEngine.Utils.ValueCategory.Angle: return value.ToString(format, CultureInfo.InvariantCulture) + "°";
- case FlaxEngine.Utils.ValueCategory.Time: return value.ToString(format, CultureInfo.InvariantCulture) + "s";
- // some fonts have a symbol for that: "\u33A7"
- case FlaxEngine.Utils.ValueCategory.Speed: return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m/s";
- case FlaxEngine.Utils.ValueCategory.Acceleration: return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m/s²";
- case FlaxEngine.Utils.ValueCategory.Area: return (value / Units.Meters2Units / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m²";
- case FlaxEngine.Utils.ValueCategory.Volume: return (value / Units.Meters2Units / Units.Meters2Units / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m³";
- case FlaxEngine.Utils.ValueCategory.Mass: return value.ToString(format, CultureInfo.InvariantCulture) + "kg";
- case FlaxEngine.Utils.ValueCategory.Force: return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "N";
- case FlaxEngine.Utils.ValueCategory.Torque: return (value / Units.Meters2Units / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "Nm";
- case FlaxEngine.Utils.ValueCategory.None:
- default:
- return FormatFloat(value);
- }
+ const string format = "G7";
+ return InternalFormat(value, format, category);
}
///
@@ -1226,26 +1231,10 @@ namespace FlaxEditor.Utilities
return "Infinity";
if (double.IsNegativeInfinity(value) || value == double.MinValue)
return "-Infinity";
- const string format = "g15";
- if (!Units.UseUnitsFormatting)
+ if (!Units.UseUnitsFormatting || category == FlaxEngine.Utils.ValueCategory.None)
return FormatFloat(value);
- switch (category)
- {
- case FlaxEngine.Utils.ValueCategory.Distance:
- if (!Units.AutomaticUnitsFormatting)
- return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m";
- var absValue = Mathf.Abs(value);
- // in case a unit != cm this would be (value / Maters2Units * 100)
- if (absValue < Units.Meters2Units)
- return value.ToString(format, CultureInfo.InvariantCulture) + "cm";
- if (absValue < Units.Meters2Units * 1000)
- return (value / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "m";
- return (value / 1000 / Units.Meters2Units).ToString(format, CultureInfo.InvariantCulture) + "km";
- case FlaxEngine.Utils.ValueCategory.Angle: return value.ToString(format, CultureInfo.InvariantCulture) + "°";
- case FlaxEngine.Utils.ValueCategory.None:
- default:
- return FormatFloat(value);
- }
+ const string format = "G15";
+ return InternalFormat(value, format, category);
}
///
@@ -1259,7 +1248,7 @@ namespace FlaxEditor.Utilities
return "Infinity";
if (float.IsNegativeInfinity(value) || value == float.MinValue)
return "-Infinity";
- string str = value.ToString("g7", CultureInfo.InvariantCulture);
+ string str = value.ToString("R", CultureInfo.InvariantCulture);
return FormatFloat(str, value < 0);
}
@@ -1274,7 +1263,7 @@ namespace FlaxEditor.Utilities
return "Infinity";
if (double.IsNegativeInfinity(value) || value == double.MinValue)
return "-Infinity";
- string str = value.ToString("g15", CultureInfo.InvariantCulture);
+ string str = value.ToString("R", CultureInfo.InvariantCulture);
return FormatFloat(str, value < 0);
}