Проблема скалярного форматирования с количеством цифр - PullRequest
1 голос
/ 27 января 2020

Я пытаюсь написать команду, которая возвращает скаляр, процент которого округляется до 2 десятичных знаков. Процент может быть отрицательным или положительным, с неизвестным числом цифр перед десятичной точкой.

Вот MRE, которое показывает мою проблему.

#delimit;

capture program drop my_note;
program my_note, eclass;
    local my_x: display %-9.2f 92.23999999999999;
    ereturn scalar my_x = `my_x';
end;

ereturn clear;
my_note;
ereturn list;

display %-9.2f 92.23999999999999;
display 92.23999999999999;

Я озадачен, почему дисплей кажется поступите правильно (включите 92.23999999999999 в 92.24, хотя и независимо от формата), но, похоже, e (my_x) не наследует этот формат.

1 Ответ

3 голосов
/ 27 января 2020

Когда вы создаете свой скаляр, вы копируете значение `my_x', а значение по-прежнему равно 92.23999999999999, поскольку : display не изменяет базовые данные, а только то, как они отображаются. Представьте, что данные в 5.00e+2 и 500 одинаковы, отличается только то, как отображается это значение.

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

  1. Хотя скаляры обычно могут содержать как строки, так и значения чисел c, возвращаемые скаляры не могут содержать строки (не спрашивайте мне почему). Можно ли вместо этого вернуть локальный?

  2. В %-9.2f вы указываете, что формат отображения должен быть длиной 9 символов, поэтому ваш скаляр будет e(my_x) : "92.24 ". Вы можете настроить %-9.2f, но так как вы сейчас работаете со строками, вы можете удалить лишние пробелы, используя функцию trim().

Попробуйте приведенный ниже код и посмотрите, работает ли он, учитывая контекст этой функции. Если нет, расскажите нам больше о том, что вы собираетесь делать.

#delimit;

capture program drop my_note;
program my_note, eclass;
    local my_x: display %-9.2f 92.23999999999999;
    ereturn local my_x = trim("`my_x'");
end;

ereturn clear;
my_note;
ereturn list;
...