Skip to content

fix: localized floating numbers handling#1616

Merged
Interkarma merged 2 commits intoInterkarma:masterfrom
petchema:fix-missing-modsettings-invariantculture
Dec 8, 2019
Merged

fix: localized floating numbers handling#1616
Interkarma merged 2 commits intoInterkarma:masterfrom
petchema:fix-missing-modsettings-invariantculture

Conversation

@petchema
Copy link
Copy Markdown
Collaborator

Fixes two issues that only happen in some locales (like french) that do not use the dot as floating point separator:

  • Join correctly writes lists of values with InvariantCulture, but TrySplit does not, leading to parse errors:

Failed to split values from 0.65,1.05
System.FormatException: Unknown char: .
at System.Double.Parse (System.String s, NumberStyles style,
IFormatProvider provider) [0x00000] in :0
at System.Single.Parse (System.String s, IFormatProvider provider)
[0x00000] in :0
at System.Convert.ToSingle (System.String value, IFormatProvider
provider) [0x00000] in :0
at System.String.System.IConvertible.ToSingle (IFormatProvider
provider) [0x00000] in :0
at System.Convert.ToType (System.Object value, System.Type
conversionType, IFormatProvider provider, Boolean try_target_to_type)
[0x00000] in :0
at System.Convert.ChangeType (System.Object value, System.Type
conversionType) [0x00000] in :0
at
DaggerfallWorkshop.Game.Utility.ModSupport.ModSettings.Key.TrySplit[Single]
(System.String input, Int32 count, System.Single[]& items) [0x00000] in
:0

(Filename: ./Runtime/Export/Debug.bindings.h Line: 43)

Failed to split values from 0.8,1
System.FormatException: Unknown char: .
at System.Double.Parse (System.String s, NumberStyles style,
IFormatProvider provider) [0x00000] in :0
at System.Single.Parse (System.String s, IFormatProvider provider)
[0x00000] in :0
at System.Convert.ToSingle (System.String value, IFormatProvider
provider) [0x00000] in :0
at System.String.System.IConvertible.ToSingle (IFormatProvider
provider) [0x00000] in :0
at System.Convert.ToType (System.Object value, System.Type
conversionType, IFormatProvider provider, Boolean try_target_to_type)
[0x00000] in :0
at System.Convert.ChangeType (System.Object value, System.Type
conversionType) [0x00000] in :0
at
DaggerfallWorkshop.Game.Utility.ModSupport.ModSettings.Key.TrySplit[Single]
(System.String input, Int32 count, System.Single[]& items) [0x00000] in
:0

(Filename: ./Runtime/Export/Debug.bindings.h Line: 43)

Failed to split values from 0.1,0.9
System.FormatException: Unknown char: .
at System.Double.Parse (System.String s, NumberStyles style,
IFormatProvider provider) [0x00000] in :0
at System.Single.Parse (System.String s, IFormatProvider provider)
[0x00000] in :0
at System.Convert.ToSingle (System.String value, IFormatProvider
provider) [0x00000] in :0
at System.String.System.IConvertible.ToSingle (IFormatProvider
provider) [0x00000] in :0
at System.Convert.ToType (System.Object value, System.Type
conversionType, IFormatProvider provider, Boolean try_target_to_type)
[0x00000] in :0
at System.Convert.ChangeType (System.Object value, System.Type
conversionType) [0x00000] in :0
at
DaggerfallWorkshop.Game.Utility.ModSupport.ModSettings.Key.TrySplit[Single]
(System.String input, Int32 count, System.Single[]& items) [0x00000] in
:0

(Filename: ./Runtime/Export/Debug.bindings.h Line: 43)

Failed to split values from 0.2,0.6
System.FormatException: Unknown char: .
at System.Double.Parse (System.String s, NumberStyles style,
IFormatProvider provider) [0x00000] in :0
at System.Single.Parse (System.String s, IFormatProvider provider)
[0x00000] in :0
at System.Convert.ToSingle (System.String value, IFormatProvider
provider) [0x00000] in :0
at System.String.System.IConvertible.ToSingle (IFormatProvider
provider) [0x00000] in :0
at System.Convert.ToType (System.Object value, System.Type
conversionType, IFormatProvider provider, Boolean try_target_to_type)
[0x00000] in :0
at System.Convert.ChangeType (System.Object value, System.Type
conversionType) [0x00000] in :0
at
DaggerfallWorkshop.Game.Utility.ModSupport.ModSettings.Key.TrySplit[Single]
(System.String input, Int32 count, System.Single[]& items) [0x00000] in
:0

(Filename: ./Runtime/Export/Debug.bindings.h Line: 43)

Failed to split values from 0.1,0.8
System.FormatException: Unknown char: .
at System.Double.Parse (System.String s, NumberStyles style,
IFormatProvider provider) [0x00000] in :0
at System.Single.Parse (System.String s, IFormatProvider provider)
[0x00000] in :0
at System.Convert.ToSingle (System.String value, IFormatProvider
provider) [0x00000] in :0
at System.String.System.IConvertible.ToSingle (IFormatProvider
provider) [0x00000] in :0
at System.Convert.ToType (System.Object value, System.Type
conversionType, IFormatProvider provider, Boolean try_target_to_type)
[0x00000] in :0
at System.Convert.ChangeType (System.Object value, System.Type
conversionType) [0x00000] in :0
at
DaggerfallWorkshop.Game.Utility.ModSupport.ModSettings.Key.TrySplit[Single]
(System.String input, Int32 count, System.Single[]& items) [0x00000] in
:0

(Filename: ./Runtime/Export/Debug.bindings.h Line: 43)

Failed to split values from 0,1.1
System.FormatException: Unknown char: .
at System.Double.Parse (System.String s, NumberStyles style,
IFormatProvider provider) [0x00000] in :0
at System.Single.Parse (System.String s, IFormatProvider provider)
[0x00000] in :0
at System.Convert.ToSingle (System.String value, IFormatProvider
provider) [0x00000] in :0
at System.String.System.IConvertible.ToSingle (IFormatProvider
provider) [0x00000] in :0
at System.Convert.ToType (System.Object value, System.Type
conversionType, IFormatProvider provider, Boolean try_target_to_type)
[0x00000] in :0
at System.Convert.ChangeType (System.Object value, System.Type
conversionType) [0x00000] in :0
at
DaggerfallWorkshop.Game.Utility.ModSupport.ModSettings.Key.TrySplit[Single]
(System.String input, Int32 count, System.Single[]& items) [0x00000] in
:0

  • Other issue is related to float tuples deserialization; For example ConvenientClock allows to set clock scale, correctly write this setting in InvariantCulture format, but is not restored in game (clock stays at its nominal size).

Join correctly writes lists of values with InvariantCulture, but
TrySplit does not, leading to parse errors:

Failed to split values from 0.65,1.05
System.FormatException: Unknown char: .
  at System.Double.Parse (System.String s, NumberStyles style,
IFormatProvider provider) [0x00000] in <filename unknown>:0
  at System.Single.Parse (System.String s, IFormatProvider provider)
[0x00000] in <filename unknown>:0
  at System.Convert.ToSingle (System.String value, IFormatProvider
provider) [0x00000] in <filename unknown>:0
  at System.String.System.IConvertible.ToSingle (IFormatProvider
provider) [0x00000] in <filename unknown>:0
  at System.Convert.ToType (System.Object value, System.Type
conversionType, IFormatProvider provider, Boolean try_target_to_type)
[0x00000] in <filename unknown>:0
  at System.Convert.ChangeType (System.Object value, System.Type
conversionType) [0x00000] in <filename unknown>:0
  at
DaggerfallWorkshop.Game.Utility.ModSupport.ModSettings.Key.TrySplit[Single]
(System.String input, Int32 count, System.Single[]& items) [0x00000] in
<filename unknown>:0

(Filename: ./Runtime/Export/Debug.bindings.h Line: 43)

Failed to split values from 0.8,1
System.FormatException: Unknown char: .
  at System.Double.Parse (System.String s, NumberStyles style,
IFormatProvider provider) [0x00000] in <filename unknown>:0
  at System.Single.Parse (System.String s, IFormatProvider provider)
[0x00000] in <filename unknown>:0
  at System.Convert.ToSingle (System.String value, IFormatProvider
provider) [0x00000] in <filename unknown>:0
  at System.String.System.IConvertible.ToSingle (IFormatProvider
provider) [0x00000] in <filename unknown>:0
  at System.Convert.ToType (System.Object value, System.Type
conversionType, IFormatProvider provider, Boolean try_target_to_type)
[0x00000] in <filename unknown>:0
  at System.Convert.ChangeType (System.Object value, System.Type
conversionType) [0x00000] in <filename unknown>:0
  at
DaggerfallWorkshop.Game.Utility.ModSupport.ModSettings.Key.TrySplit[Single]
(System.String input, Int32 count, System.Single[]& items) [0x00000] in
<filename unknown>:0

(Filename: ./Runtime/Export/Debug.bindings.h Line: 43)

Failed to split values from 0.1,0.9
System.FormatException: Unknown char: .
  at System.Double.Parse (System.String s, NumberStyles style,
IFormatProvider provider) [0x00000] in <filename unknown>:0
  at System.Single.Parse (System.String s, IFormatProvider provider)
[0x00000] in <filename unknown>:0
  at System.Convert.ToSingle (System.String value, IFormatProvider
provider) [0x00000] in <filename unknown>:0
  at System.String.System.IConvertible.ToSingle (IFormatProvider
provider) [0x00000] in <filename unknown>:0
  at System.Convert.ToType (System.Object value, System.Type
conversionType, IFormatProvider provider, Boolean try_target_to_type)
[0x00000] in <filename unknown>:0
  at System.Convert.ChangeType (System.Object value, System.Type
conversionType) [0x00000] in <filename unknown>:0
  at
DaggerfallWorkshop.Game.Utility.ModSupport.ModSettings.Key.TrySplit[Single]
(System.String input, Int32 count, System.Single[]& items) [0x00000] in
<filename unknown>:0

(Filename: ./Runtime/Export/Debug.bindings.h Line: 43)

Failed to split values from 0.2,0.6
System.FormatException: Unknown char: .
  at System.Double.Parse (System.String s, NumberStyles style,
IFormatProvider provider) [0x00000] in <filename unknown>:0
  at System.Single.Parse (System.String s, IFormatProvider provider)
[0x00000] in <filename unknown>:0
  at System.Convert.ToSingle (System.String value, IFormatProvider
provider) [0x00000] in <filename unknown>:0
  at System.String.System.IConvertible.ToSingle (IFormatProvider
provider) [0x00000] in <filename unknown>:0
  at System.Convert.ToType (System.Object value, System.Type
conversionType, IFormatProvider provider, Boolean try_target_to_type)
[0x00000] in <filename unknown>:0
  at System.Convert.ChangeType (System.Object value, System.Type
conversionType) [0x00000] in <filename unknown>:0
  at
DaggerfallWorkshop.Game.Utility.ModSupport.ModSettings.Key.TrySplit[Single]
(System.String input, Int32 count, System.Single[]& items) [0x00000] in
<filename unknown>:0

(Filename: ./Runtime/Export/Debug.bindings.h Line: 43)

Failed to split values from 0.1,0.8
System.FormatException: Unknown char: .
  at System.Double.Parse (System.String s, NumberStyles style,
IFormatProvider provider) [0x00000] in <filename unknown>:0
  at System.Single.Parse (System.String s, IFormatProvider provider)
[0x00000] in <filename unknown>:0
  at System.Convert.ToSingle (System.String value, IFormatProvider
provider) [0x00000] in <filename unknown>:0
  at System.String.System.IConvertible.ToSingle (IFormatProvider
provider) [0x00000] in <filename unknown>:0
  at System.Convert.ToType (System.Object value, System.Type
conversionType, IFormatProvider provider, Boolean try_target_to_type)
[0x00000] in <filename unknown>:0
  at System.Convert.ChangeType (System.Object value, System.Type
conversionType) [0x00000] in <filename unknown>:0
  at
DaggerfallWorkshop.Game.Utility.ModSupport.ModSettings.Key.TrySplit[Single]
(System.String input, Int32 count, System.Single[]& items) [0x00000] in
<filename unknown>:0

(Filename: ./Runtime/Export/Debug.bindings.h Line: 43)

Failed to split values from 0,1.1
System.FormatException: Unknown char: .
  at System.Double.Parse (System.String s, NumberStyles style,
IFormatProvider provider) [0x00000] in <filename unknown>:0
  at System.Single.Parse (System.String s, IFormatProvider provider)
[0x00000] in <filename unknown>:0
  at System.Convert.ToSingle (System.String value, IFormatProvider
provider) [0x00000] in <filename unknown>:0
  at System.String.System.IConvertible.ToSingle (IFormatProvider
provider) [0x00000] in <filename unknown>:0
  at System.Convert.ToType (System.Object value, System.Type
conversionType, IFormatProvider provider, Boolean try_target_to_type)
[0x00000] in <filename unknown>:0
  at System.Convert.ChangeType (System.Object value, System.Type
conversionType) [0x00000] in <filename unknown>:0
  at
DaggerfallWorkshop.Game.Utility.ModSupport.ModSettings.Key.TrySplit[Single]
(System.String input, Int32 count, System.Single[]& items) [0x00000] in
<filename unknown>:0

Other issue is related to float tuples deserialization; For example
ConvenientClock allows to set clock scale, correctly write this setting
in InvariantCulture format, but is not restored in game (clock stays at
its nominal size).
@petchema petchema added the bug label Nov 20, 2019
@petchema
Copy link
Copy Markdown
Collaborator Author

@TheLacus there's another localization issue with float input fields:

  • float fields are prefilled with localized separator (say, the comma in french);
  • however you aren't allowed to type commas in those fields, only dots;
  • but after you enter a value with a dot, you can't validate the form

@petchema petchema requested a review from rossipaolo November 20, 2019 05:35
@petchema
Copy link
Copy Markdown
Collaborator Author

Assumes negative sign and decimal separator are single characters
@petchema petchema changed the title fix missing InvariantCultures in ModSettings fix: localized floating numbers handling Nov 20, 2019
@Interkarma
Copy link
Copy Markdown
Owner

Thank you for fixing this. :)

@Interkarma Interkarma merged commit 180cf05 into Interkarma:master Dec 8, 2019
@rossipaolo rossipaolo removed their request for review August 6, 2021 15:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants