Приложения для линукс — неиссякающий источник еды. Итак, дано: идея написать плагин-калькулятор на Lua для medit. Надо сказать, про Lua я не знаю ровным счётом ничего. Открываю мануалы на Lua и на API редактора, начинаю писать.
line_nr = doc.get_line_at_cursor()
cur_line_end = doc.get_pos_at_line_end(line_nr)
doc.set_cursor_pos(cur_line_end)
doc.insert_text("\n")
text = doc.get_line_text(line_nr)
f = loadstring("return (" .. text .. ")")
result = tostring(f())
doc.insert_text(result)
Проверяем:
20/4
5
21/4
5,25
Проверяем:
> os.setlocale("C")
> print(tostring(1.5))
1.5
> os.setlocale("ru_RU.UTF-8")
> print(tostring(1.5))
1,5
Копаем сорцы. Находим, что tostring работает через sprintf. sprintf использует десятичный разделитель локали. Курю man sprintf на предмет принудительного использования точки в качестве разделителя. Ничего не накуриваю.
Думаю, ладно — хрен с тобой, золотая рыбка. Подменю локаль прямо в скрипте. Пишем:
line_nr = doc.get_line_at_cursor()
cur_line_end = doc.get_pos_at_line_end(line_nr)
doc.set_cursor_pos(cur_line_end)
doc.insert_text("\n")
text = doc.get_line_text(line_nr)
f = loadstring("return (" .. text .. ")")
result = f()
old_locale = os.setlocale(nil)
os.setlocale("C")
result = tostring(result)
os.setlocale(old_locale)
doc.insert_text(result)
И-и-и-и... обламываюсь! Потому что объект os в API medit-а не входит.
Вот прям даже не знаю, куда репортить это нелепое стечение обстоятельств. Наверное всё-таки в Lua. Ибо какого черта они не дали готовой функции для локаленезависимого преобразования чисел в строки.