Преобразование числа с форматом в строку

#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 функции позволяют вам это сделать.