|
|
@@ -201,8 +201,9 @@ namespace MoonSharp.Interpreter.CoreLib
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- //!COMPAT: tonumber supports only 2,8,10 or 16 as base
|
|
|
- DynValue ee;
|
|
|
+ //!COMPAT: tonumber supports only 2,8,10 or 16 as base
|
|
|
+ //UPDATE: added support for 3-9 base numbers
|
|
|
+ DynValue ee;
|
|
|
|
|
|
if (args[0].Type != DataType.Number)
|
|
|
ee = args.AsType(0, "tonumber", DataType.String, false);
|
|
|
@@ -211,12 +212,28 @@ namespace MoonSharp.Interpreter.CoreLib
|
|
|
|
|
|
int bb = (int)b.Number;
|
|
|
|
|
|
- if (bb != 2 && bb != 8 && bb != 10 && bb != 16)
|
|
|
- {
|
|
|
- throw new ScriptRuntimeException("bad argument #2 to 'tonumber' (base out of range)");
|
|
|
- }
|
|
|
-
|
|
|
- uint uiv = Convert.ToUInt32(ee.String.Trim(), bb);
|
|
|
+ uint uiv = 0;
|
|
|
+ if (bb == 2 || bb == 8 || bb == 10 || bb == 16)
|
|
|
+ {
|
|
|
+ uiv = Convert.ToUInt32(ee.String.Trim(), bb);
|
|
|
+ }
|
|
|
+ else if (bb < 10 && bb > 2) // Support for 3, 4, 5, 6, 7 and 9 based numbers
|
|
|
+ {
|
|
|
+ foreach (char digit in ee.String.Trim())
|
|
|
+ {
|
|
|
+ int value = digit - 48;
|
|
|
+ if (value < 0 || value >= bb)
|
|
|
+ {
|
|
|
+ throw new ScriptRuntimeException("bad argument #1 to 'tonumber' (invalid character)");
|
|
|
+ }
|
|
|
+
|
|
|
+ uiv = (uint)(uiv * bb) + (uint)value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ throw new ScriptRuntimeException("bad argument #2 to 'tonumber' (base out of range)");
|
|
|
+ }
|
|
|
|
|
|
return DynValue.NewNumber(uiv);
|
|
|
}
|