首页 > 解决方案 > 将字符“小数”(逗号分隔符)和字符“整数”格式化为数字“小数”(点分隔符)

问题描述

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

设置我正在读取 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;

标签: sas

解决方案


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

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

通常,您不想在您的信息中添加十进制规范。仅当源字符串没有明确的小数点时才使用信息的小数部分。基本上,它告诉 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;

在此处输入图像描述


推荐阅读