将字符“小数”(逗号定界符)和字符“整数”格式化为数字“小数”(点定界符)

时间:2019-01-25 12:07:00

标签: sas

这与我最近的其他question有关。

设置我正在读取类型为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的问题可能可以通过用'。'代替','来解决,但是没有小数点分隔符的字符仍然是一个问题。

对此有什么聪明的解决方案吗?

我的解决方案 有点hacky(并且基本上只使用逗号引入长度> 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 :(得分:2)

类似文本字符串的声音是在逗号和数字句号的正常含义颠倒的地方创建的。因此,与其使用小数点和逗号来进行千位分组,不如使用相反的含义。

对于这种类型的字符串,SAS具有COMMAX信息。

通常,您不想在您的信息中添加一个十进制规范。仅当源字符串没有明确的小数点时,才使用informat的小数部分。基本上,这是在告诉SAS将没有显式小数点的值除以10等于信息规范中小数位数的幂。它旨在读取有意不写小数点的数据,以节省空间。

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

答案 1 :(得分:1)

事实证明(找到了here), COMMAXw,d 可以毫不费力地完成操作,那么代码将是:

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

我觉得它有点违反直觉,但确实有效。