Sas 格式化字符';小数';(逗号分隔符)和字符';整数';到数字';小数';(点分隔符)

Sas 格式化字符';小数';(逗号分隔符)和字符';整数';到数字';小数';(点分隔符),sas,Sas,这与我最近的另一个问题有些关联 设置我正在读取排序为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;

这与我最近的另一个问题有些关联

设置我正在读取排序为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
如果like 10,00(应该是10)变为100,则可能通过用“.”替换“,”来解决问题,但是没有十进制分隔符的字符仍然是一个问题

有什么聪明的解决办法吗

我的解决方案有点老套(基本上只使用逗号引入长度大于2的事实-例如123的问题仍然会出现):

事实证明(找到了它)COMMAXw,d没有任何麻烦就完成了这个任务,代码是:

data _null_;
    test='0,5';
    result = input(test, COMMAX10.);
    put 'this should be:' result;
run;
我觉得这有点违反直觉,但它是有效的。

事实证明(找到了它)COMMAXw,d可以毫不费力地完成这项任务,代码是:

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

我觉得这有点违反直觉,但它很管用。

听起来你的文本字符串是在数字中逗号和句点的正常含义颠倒的地方创建的。因此,他们没有用句号表示小数点,用逗号表示千位分组,而是颠倒了含义

对于该类型的字符串,SAS具有
COMMAX
informat

通常,您不希望将十进制规范添加到信息中。仅当源字符串没有显式小数点时,才使用信息的小数部分。基本上,它告诉SAS将没有明确小数点的值除以informat规范中小数位数的幂10。它的设计目的是读取故意不写入小数点以节省空间的数据

几乎所有的
逗号
信息都是去掉字符串中的逗号和美元符号,然后用普通的数字信息读取

COMMAX
informat可以理解逗号和句点的相反含义。所以它基本上消除了句点,然后将逗号转换成句点,然后使用普通的数字信息读取它

试试你自己的小测试

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;

听起来,您的文本字符串是在数字中逗号和句点的正常含义颠倒的地方创建的。因此,他们没有用句号表示小数点,用逗号表示千位分组,而是颠倒了含义

对于该类型的字符串,SAS具有
COMMAX
informat

通常,您不希望将十进制规范添加到信息中。仅当源字符串没有显式小数点时,才使用信息的小数部分。基本上,它告诉SAS将没有明确小数点的值除以informat规范中小数位数的幂10。它的设计目的是读取故意不写入小数点以节省空间的数据

几乎所有的
逗号
信息都是去掉字符串中的逗号和美元符号,然后用普通的数字信息读取

COMMAX
informat可以理解逗号和句点的相反含义。所以它基本上消除了句点,然后将逗号转换成句点,然后使用普通的数字信息读取它

试试你自己的小测试

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;

一个完美的答案,谢谢你,汤姆!非常好的概述。我已经意识到我必须使用COMMAX格式选项,尽管我发现这有点不直观(在阅读了对逗号的描述后,我确信这是正确的格式,因为它使用逗号作为小数的分隔符)。COMMAX格式用于从数字生成字符串。要想走另一条路,你需要用一个信息来代替。一个完美的答案,再次感谢你,汤姆!非常好的概述。我已经意识到我必须使用COMMAX格式选项,尽管我发现这有点不直观(在阅读了对逗号的描述后,我确信这是正确的格式,因为它使用逗号作为小数的分隔符)。COMMAX格式用于从数字生成字符串。要想走另一条路,你需要使用informat。