#sas
#sas
Вопрос:
Как преобразовать числовую или валютную переменную в символьную строку, которая сохраняет формат как часть строки?
Например, приведенный ниже код имеет символьную переменную, MSRP_to_text
, и переменную валюты, MSRP
. Когда я устанавливаю MSRP_to_text
значение равно MSRP
, оно принимает неформатированное число и преобразует его в строку, поэтому знак доллара и запятая исчезают.
DATA want;
SET SASHELP.CARS(KEEP=MSRP);
ATTRIB MSRP_to_text FORMAT=$8.;
MSRP_to_text = MSRP;
RUN;
Другими словами, код в настоящее время преобразуется $36,945 -> "36945"
, но чего я действительно хочу, так это $36,945 -> "$36,945"
.
Есть ли способ сохранить знак доллара и запятую в строке?
Комментарии:
1. Почему вы прикрепили $ 8. format к новой переменной? Если вы хотите установить его длину равной 8 долларам США, тогда используйте атрибут LENGTH . Нет необходимости присоединять $ 8. формат, поскольку SAS уже знает, как отображать символьные строки.
2. Вы хотите, чтобы значение выравнивалось по левому краю или по правому краю в новой символьной переменной?
'$36,945 '
против' $36,945'
Ответ №1:
VVALUE
функция извлекает форматированное значение переменной.
MSRP_as_text = VVALUE(MSRP);
VVALUEX
идет на один шаг дальше для случая, когда имя переменной является динамическим; например, хранится в другой переменной или вычисляется из некоторого алгоритма формирования имен.
name = 'MSRP';
formatted_value = VVALUEX(name);
Комментарии:
1. Это отличный ответ! Я полагал, что у SAS должно быть что-то, что это делает, но после некоторого поиска я, похоже, не нашел правильную комбинацию ключевых слов. Мне нравится, что вы добавили больше информации о.
VVALUEX
Я бы никогда не подумал искать подобную функцию, но это может быть действительно полезно, спасибо!
Ответ №2:
Вместо оператора ATTRIB используйте функцию PUT для преобразования числа в символ. и он сохранит текстовое значение с форматом. Поскольку исходный формат MSRP равен DOLLAR8. , поэтому для достижения этой цели достаточно использовать тот же формат в операторе put
DATA want;
SET SASHELP.CARS(KEEP=MSRP);
MSRP_to_text = put(MSRP, DOLLAR8.);
RUN;
proc contents data=want; run;
Комментарии:
1. Хотя этот ответ работает, я выбираю Richard’s, поскольку
VVALUE
не требует такого формата, какPUT
does .2.
VVALUE
использует формат, связанный с переменной во время выполнения шага данных. Если вы хотите сопоставить значение, используя определенный или динамический формат, игнорируя текущий формат или формат без него,PUT/PUTN/PUTC
функции позволяют вам это сделать.