Fix arithmetic coercion - refactored and enhanced (#1576)

The Lua 5.4 compatible `tonumber` implementation completely reworked

- custom char-by-char parser (no regexes)
- proper Lua space handling
- support for heximal integers and floats
- support for scientific float notation
- extended tests
- updated website docs

Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
This commit is contained in:
Matouš Jan Fialka
2025-10-01 11:30:58 +02:00
committed by GitHub
parent 26d9d5bdf0
commit 80f31da16b
7 changed files with 656 additions and 48 deletions
+9 -21
View File
@@ -540,26 +540,14 @@ local r = query [[from p = data where type(p.favorite) == "table" and p.favorite
assertEqual(#r, 1)
assertEqual(r[1].name, "John")
-- Test tonumber function
assertEqual(tonumber("123"), 123)
assertEqual(tonumber("123.45"), 123.45)
assertEqual(tonumber("-123"), -123)
assertEqual(tonumber("0"), 0)
assertEqual(tonumber(""), nil)
assertEqual(tonumber("abc"), nil)
assertEqual(tonumber("12.34.56"), nil)
-- Test tonumber with base
assertEqual(tonumber("1010", 2), 10) -- Binary
assertEqual(tonumber("FF", 16), 255) -- Hexadecimal
assertEqual(tonumber("377", 8), 255) -- Octal
assertEqual(tonumber("z", 36), 35) -- Base 36
assertEqual(tonumber("1010", 10), 1010) -- Decimal (explicit)
assertEqual(tonumber("1010", 1), nil) -- Invalid base
assertEqual(tonumber("1010", 37), nil) -- Invalid base
assertEqual(tonumber("FF", 10), nil) -- Invalid hex in decimal
assertEqual(tonumber("8", 8), nil) -- Invalid octal digit
-- Test string to number coercion for arithmetical operations
assertEqual(-1*' 16 ' == -16, true)
assertEqual(0-'0X10' == -16, true)
assertEqual('-0x10'/1 == -16, true)
assertEqual('-0X10p0'//1 == -16, true)
assertEqual('0x10P0'%15 == 1, true)
assertEqual('0X10P-1'^-1 == 0.125, true)
assertEqual(-'16' == -16, true)
-- select tests
-- Base case
@@ -603,4 +591,4 @@ function varArgTest(a0, ...)
assertEqual(a2, 3)
end
varArgTest(1, 2, 3, 4)
varArgTest(1, 2, 3, 4)