Как получить число с плавающей запятой в Lua из текстовой записи IUP

Я пытаюсь выполнить простой код, чтобы получить десятичное значение от пользователя:

require( "iuplua" )

t1 = iup.text{expand = "YES", padding = "10x10", alignment="ARIGHT", size="40x"}
btn = iup.button {title = "Print:", padding = "10x10", alignment="ACENTER", size="40x"}
qbtn = iup.button{title="Quit", expand = "YES", padding = "10x10", alignment="ACENTER", size="40x"}

function btn:action()
    strval1 = string.match (t1.value, "%d+")
    print (strval1)
    num = tonumber(strval1)
    print (num)
    end

function qbtn:action()
    os.exit()
    end

dlg = iup.dialog {
 iup.vbox{
    iup.hbox{
        iup.label{title="Decimal:", padding = "10x10", alignment="ALEFT", size="40x"},
        t1  },
    iup.hbox{
        btn,
        qbtn }}}

dlg:show()
iup.MainLoop() 

Однако он выводит только целое число (часть перед десятичной дробью — даже 25,9999 печатается как 25).

Как я могу получить число с плавающей запятой или десятичное значение, введенное пользователем? Спасибо за вашу помощь.


person rnso    schedule 25.10.2017    source источник


Ответы (2)


Проблема с кодом в том, что шаблон "%d+" в btn:action получает только первую серию цифр.

Вы можете изменить шаблон для обработки десятичных точек, но трудно написать шаблон, который работает во всех случаях, включая необязательный знак и десятичную точку и научный формат.

Лучше всего позволить tonumber сделать свою работу: она вернет nil, если строку нельзя преобразовать в число.

person lhf    schedule 25.10.2017
comment
Это идеально - самый простой и точный! tonumber(t1.value) работает. - person rnso; 25.10.2017

Другой вариант — использовать атрибут MASK IupText, чтобы пользователь мог вводить только числа.

person Antonio Scuri    schedule 25.10.2017