1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
* Тема: замена буквы в строке на набор цифр с последующим конвертированием в число.
* Ключевые слова: замена, преобразование, буква, цифры, число, конвертирование.
* Опубликован: 16.06.2008.
* Автор: Raynald Levesque.
* Перевод: А. Балабанов.

* (Вопрос) В моей строковой переменной наряду (между, вместо) с цифрами иногда попадаются буквы.
* Нужно в таких случаях заменить букву символами "9999", а затем 
  конвертировать полученное значение в число.

* (Ответ) Размещён в декабре 2002 года, автор: Raynald Levesque.

DATA LIST LIST /rec(F3) var1(A8).
* Используйте "." вместо "," если в системных настройках десятичный разделитель - точка.
BEGIN DATA
1	546,23
2	25,2
3	31,28
4	V28,00
5 	2B42,
6	20Z
7	29,C29
8	12345
END DATA.
LIST.

STRING var2(A13).

* Используйте функцию INDEX вместо CHAR.INDEX при работе на более старых версиях SPSS.
* Используйте "." вместо "," если в системных настройках десятичный разделитель - точка.
DO IF CHAR.INDEX(var1,",")=0.
* Используйте "." вместо "," если в системных настройках десятичный разделитель - точка.
- COMPUTE var2=CONCAT(RTRIM(var1),",").
ELSE.
- COMPUTE var2=var1.
END IF.
EXECUTE.

COMPUTE len2=LEN(RTRIM(var2)).
LOOP cnt=1 TO len2.
* Проверьте, соответствует ли диапазон значений возможным буквам в строке.
- DO IF RANGE(SUBSTR(var2,cnt,1),"a","Z").
-   COMPUTE idx=cnt.
-   BREAK.
- END IF.
END LOOP.
DO IF idx=1.
COMPUTE var2=CONCAT("9999",SUBSTR(var2,2)).
ELSE IF idx < len2.
COMPUTE var2=CONCAT(SUBSTR(var2,1,idx-1),"9999",SUBSTR(var2,idx+1)).
ELSE.
COMPUTE var2=CONCAT(SUBSTR(var2,1,idx-1),"9999").
END IF.

COMPUTE nb=NUMBER(var2,F10.2).
FORMATS nb(F16.6).
LIST var1 var2 nb.