LUA – Nummer tot stringgedrag

Ik zou graag willen weten hoe Lua het nummer verwerkt om conversies te stringen met behulp van de tostring()-functie.

Het gaat omzetten naar een INT (als tekenreeks) als het nummer rond is (dat wil zeggen als number == (int) number) of is het altijd een reële (als string uitgevoerd ) zoals 10.0?

Ik moet het exacte gedrag van Lua’s tostringin C naemmeren, zonder de LUA C API te gebruiken, omdat ik in dit geval geen lua_Stategebruik.


Antwoord 1, Autoriteit 100%

In Lua 5.2 of eerder, zowel tostring(10)en tostring(10.0)Resultaat als de string "10".

In Lua 5.3 is dit gewijzigd:

print(tostring(10)) -- "10"
print(tostring(10.0)) -- "10.0"

Dat komt omdat LUA 5.3 het integer subtype introduceerde. Van Wijzigingen in de taal :

De conversie van een vlotter naar een string voegt nu een .0achtervoegsel toe aan het resultaat als het eruit ziet als een geheel getal. (Bijvoorbeeld, de vlotter 2.0wordt afgedrukt als 2.0, niet als 2.) U moet altijd een expliciete indeling gebruiken wanneer u een Specifiek formaat voor cijfers.


Antwoord 2, Autoriteit 7%

LUA Converteert de nummers zoals:

print(tostring(10)) => "10"
print(tostring(10.0)) => "10.0"
print(tostring(10.1)) => "10.1"

Als je met hen wilt spelen, is er een kleine online parser voor eenvoudige opdrachten zoals deze: http://www.lua.org/cgi-bin/demo
Dit gebruikt LUA 5.3.1

bewerken
Ik moet de opmerking van EGOR ondersteunen, het is versie afhankelijk.
Ik liep dit lokaal op mijn systeem:

Lua 5.2.4  Copyright (C) 1994-2015 Lua.org, PUC-Rio
> print(tostring(10))
10
> print(tostring(10.0)) 
10

Antwoord 3, Autoriteit 7%

Als u 5.3.4 gebruikt en u een snel hotfix nodig hebt, gebruik dan Math.Flowing – het werpt het naar een int-nummer. Dit slaat @warpyking-antwoord in efficiëntie, maar mist de koelte die trossen code is.

>tostring(math.floor(54.0))
54
>tostring(54.0)
54.0
>type(math.floor(54.0))
integer
>type(54.0)
number

Antwoord 4

In Lua 5.3, vanwege het integer-type, tostringop een vlotter (hoewel de numerieke waarde van een geheel van een geheel getal is) een "'.0'achtervoegsel, maar dat betekent niet dat je het niet kunt verkorten!

local str = tostring(n)
if str:sub(-2) == ".0" then
    str = str:sub(1,-3)
end

Other episodes