Форматирование символа «десятичные дроби» (разделитель запятых) И символа «целые числа» в числовые «десятичные дроби» (разделитель точек) - PullRequest
0 голосов
/ 25 января 2019

Это как-то связано с моим другим вопросом в последнее время.

Настройка Я читаю в символьных переменных типа 1 или 2,0 или 10,0 или 2,5. Я хочу преобразовать их в цифры, используя десятичную точку вместо запятой. Поэтому в идеале я хотел бы получить следующий результат:

1    -> 1
2,0  -> 2
10,0 -> 10
2,5  -> 2.5

Мой код

data _null_;
    test='5,0';
    result=input(test_point,comma10.1);
    put 'this should be:' result;
run; 

делает это для всех символьных переменных, которые имеют тип 'xy, z', но не для 'xy' без разделения запятых. Здесь я бы получил

xy  ->  x,y

Я думал добавить if / else, чтобы проверить, имеет ли длина строки символов 1 или больше. Так что-то вроде

data _null_;
    test='5';
     if length(test)=1 then result=input(test, comma10.);
     else result=input(test, comma10.1);
    put 'this should be:' result;
run;

Но проблема здесь в том, что

10  ->  1

Проблемы с 10,00 (который должен быть 10), ставшим 100, возможно, можно решить, заменив ',' на '.', Но символы без десятичного разделителя остаются проблемой.

Есть ли какое-нибудь умное решение для этого?

Мое решение , которое немного хакерское (и в основном использует только тот факт, что запятая вводит длину> 2 - проблемы с, например, 123 по-прежнему будут возникать):

 data _null_;
     t='5,5';
     test=tranwrd(t, ',', '.');
     if length(test)=1 or length(test)=2 then result=input(test, comma10.);
     else result=input(test, comma10.1);
    put 'this should be:' result;
 run;

Ответы [ 2 ]

0 голосов
/ 25 января 2019

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

Для строк этого типа в SAS есть COMMAX информация.

Обычно вы НЕ хотите добавлять десятичную спецификацию к вашей информации. Десятичная часть информации используется только в том случае, если исходная строка не имеет явной десятичной точки. По сути, это говорит SAS делить значения без явной десятичной точки на 10 в степени числа десятичных знаков в спецификации informat. Он предназначен для чтения данных, в которых десятичная точка специально не была записана для экономии места.

Практически все, что делает COMMA, - это обрезает строку запятых и знаков доллара, а затем читает ее, используя обычную числовую информацию.

Информат COMMAX - это тот, который поймет обратное значение запятых и точек. Таким образом, он в значительной степени исключает точки, а затем преобразует запятые в точки и затем читает их, используя обычную числовую информацию.

Попробуйте небольшой собственный тест.

data check;
  input @1 string $32. @1 num ??32.  @1 comma ??comma32. @1 commax ??commax32. 
        @1 d2num ??32.2 @1 d2comma ??comma32.2 @1 d2commax ??commax32.2
  ;
cards;
123
123.4
123,4
1,234.5
1.234,5
;
proc print;
run;

enter image description here

0 голосов
/ 25 января 2019

Как оказалось (нашел здесь ) COMMAXw, d делает трюк без каких-либо хлопот, код тогда будет:

data _null_;
    test='0,5';
    result = input(test, COMMAX10.);
    put 'this should be:' result;
run;

Я нахожу это немного антиинтуитивным, но это работает.

...