Обносление испортило формулы

Автор Kadet, 8 декабря 2021, 11:31

0 Пользователи и 1 гость просматривают эту тему.

mikekaganski

#15
Цитата: Kadet от  8 декабря 2021, 15:04Только не понимаю почему раньше транслятор сам переводил число, результат вычисления oVK/100 (т.е. число 0,05), в строку, а теперь перестал. И ему вдруг потребовались указания на это программиста - "Str(oVK/100)"

Блин.

Цитата: mikekaganski от  8 декабря 2021, 12:19
Раньше было так:

 dim s as string
 dim d as double
 d = 1.5
 s = d ' s = "1.5" независимо от текущей локали!!!


Теперь:

 dim s as string
 dim d as double
 d = 1.5
 s = d ' s = "1.5" в локали en-US, и s = "1,5" в локали ru-RU


Я вот честно не понимаю, зачем я всё-таки объяснять пытался. Ведь я описал, что произошло и в чём разница, и казалось бы, понятно, что не перестал он сам переводить число, а стал это делать иначе. То есть результат стандартного перевода теперь содержит не точку, а запятую - потому что стандартный перевод должен работать по законам текущей локали!

А указание программиста ему понадобилось для того, чтобы перевод был "нестандартным" - независимым от локали, и результат должен быть в "нейтральной" форме (с точкой независимо от того, что в текущей локали прописано).

Раньше Ваш код

oSheet.getCellByPosition(14, oRow).setFormula("=C701*" & oVK/100)

успешно переводил "=C701*" & oVK/100 в строку "=C701*0.05". А теперь тот же код успешно переводит то же самое выражение в строку "=C701*0,05" - а вот setFormula ожидает, что все числа туда будут записаны с точкой.
С уважением,
Михаил Каганский

sokol92

#16
Мне кажется, нужно четко разделять мир Calc и мир Basic. Это -  разные миры (точно так же, как мир Excel и мир VBA). В каждом из этих миров - свои правила.

Внутренний мир Calc не локализован и "живет" в локали en_US. Исключения из этого правила обычно указаны явно, например, FormulaLocal.
Элементы пользовательского интерфейса (формулы, диалоги и т.д.) отображаются с учетом текущей локали и параметров LO.

В языке Basic часть функций вычисляется с учетом текущей локали. К ним, в частности, относятся функции преобразования типов Cxxx (кроме Cbool). Например, в локали ru_RU
Cdate("8 декабря 2021")
выдает текущую дату.
Для неявных преобразований действуют те же правила, что и для явных. Соответственно, если s - переменная типа String, то после присвоения
s=0.05
в локализации ru_RU строка s будет содержать текст "0,05".
При использовании функции Str следует помнить, что для неотрицательных чисел результат этой функции (текст) начинается с пробела.
Функция Val имеет также ряд специфических особенностей, например
Msgbox val("1a")
покажет 1.
Владимир.