MainframeMaster

COBOL Tutorial

COBOL DECIMAL-POINT IS COMMA

The DECIMAL-POINT IS COMMA clause in COBOL allows programs to use European number formatting where comma serves as the decimal separator and period as the thousands separator.

DECIMAL-POINT Clause Syntax

cobol
1
2
3
4
5
6
7
8
ENVIRONMENT DIVISION. CONFIGURATION SECTION. SPECIAL-NAMES. DECIMAL-POINT IS COMMA. *> This affects all numeric literals and PICTURE clauses *> Period (.) becomes thousands separator *> Comma (,) becomes decimal separator

Impact on Numeric Literals

Numeric Literal Format Changes

cobol
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
ENVIRONMENT DIVISION. CONFIGURATION SECTION. SPECIAL-NAMES. DECIMAL-POINT IS COMMA. DATA DIVISION. WORKING-STORAGE SECTION. *> With DECIMAL-POINT IS COMMA: 01 WS-AMOUNT-1 PIC 9(6)V99 VALUE 123456,78. 01 WS-AMOUNT-2 PIC 9(4)V99 VALUE 1234,50. 01 WS-RATE PIC 9V999 VALUE 0,125. *> Without DECIMAL-POINT IS COMMA (standard format): *> 01 WS-AMOUNT-1 PIC 9(6)V99 VALUE 123456.78. *> 01 WS-AMOUNT-2 PIC 9(4)V99 VALUE 1234.50. *> 01 WS-RATE PIC 9V999 VALUE 0.125. PROCEDURE DIVISION. MAIN-PROCESSING. DISPLAY "Amount 1: " WS-AMOUNT-1 *> Displays: 12345678 DISPLAY "Amount 2: " WS-AMOUNT-2 *> Displays: 123450 DISPLAY "Rate: " WS-RATE *> Displays: 0125 *> Arithmetic with European format COMPUTE WS-AMOUNT-1 = WS-AMOUNT-2 * 1,5 DISPLAY "Calculated: " WS-AMOUNT-1.

PICTURE Clause Editing

cobol
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
ENVIRONMENT DIVISION. CONFIGURATION SECTION. SPECIAL-NAMES. DECIMAL-POINT IS COMMA. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-NUMERIC-VALUES. 05 WS-AMOUNT PIC 9(6)V99 VALUE 123456,78. 05 WS-PRICE PIC 9(4)V99 VALUE 1234,50. 05 WS-PERCENTAGE PIC 9V999 VALUE 0,125. *> European display formats 01 WS-EUROPEAN-DISPLAYS. 05 WS-EURO-AMOUNT PIC ZZ9.ZZ9,99. 05 WS-EURO-PRICE PIC Z.ZZ9,99. 05 WS-EURO-PERCENT PIC 0,999. *> Currency displays 01 WS-CURRENCY-DISPLAYS. 05 WS-EURO-CURRENCY PIC €ZZ9.ZZ9,99. 05 WS-POUND-CURRENCY PIC £Z.ZZ9,99. PROCEDURE DIVISION. DEMONSTRATE-FORMATTING. *> Move values to display fields MOVE WS-AMOUNT TO WS-EURO-AMOUNT MOVE WS-PRICE TO WS-EURO-PRICE MOVE WS-PERCENTAGE TO WS-EURO-PERCENT MOVE WS-AMOUNT TO WS-EURO-CURRENCY MOVE WS-PRICE TO WS-POUND-CURRENCY DISPLAY "European Formatting:" DISPLAY "Amount: " WS-EURO-AMOUNT *> 123.456,78 DISPLAY "Price: " WS-EURO-PRICE *> 1.234,50 DISPLAY "Percent: " WS-EURO-PERCENT *> 0,125 DISPLAY "Currency Formatting:" DISPLAY "Euro: " WS-EURO-CURRENCY *> €123.456,78 DISPLAY "Pound: " WS-POUND-CURRENCY. *> £1.234,50

Practical Applications

Financial Calculations

cobol
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
58
ENVIRONMENT DIVISION. CONFIGURATION SECTION. SPECIAL-NAMES. DECIMAL-POINT IS COMMA. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-FINANCIAL-DATA. 05 WS-PRINCIPAL PIC 9(8)V99 VALUE 100000,00. 05 WS-INTEREST-RATE PIC 9V9999 VALUE 0,0525. 05 WS-YEARS PIC 9(2) VALUE 10. 05 WS-MONTHLY-PAYMENT PIC 9(6)V99. 05 WS-TOTAL-INTEREST PIC 9(8)V99. 01 WS-CALCULATION-WORK. 05 WS-MONTHLY-RATE PIC 9V999999. 05 WS-NUM-PAYMENTS PIC 9(3). 05 WS-POWER-CALC COMP-2. 01 WS-DISPLAY-AMOUNTS. 05 WS-PRINCIPAL-DISP PIC €ZZZ.ZZ9,99. 05 WS-RATE-DISP PIC Z9,9999%. 05 WS-PAYMENT-DISP PIC €Z.ZZ9,99. 05 WS-INTEREST-DISP PIC €ZZZ.ZZ9,99. PROCEDURE DIVISION. CALCULATE-EUROPEAN-LOAN. *> Calculate monthly payment COMPUTE WS-MONTHLY-RATE = WS-INTEREST-RATE / 12 COMPUTE WS-NUM-PAYMENTS = WS-YEARS * 12 *> Standard loan payment formula COMPUTE WS-POWER-CALC = (1 + WS-MONTHLY-RATE) ** WS-NUM-PAYMENTS COMPUTE WS-MONTHLY-PAYMENT = WS-PRINCIPAL * (WS-MONTHLY-RATE * WS-POWER-CALC) / (WS-POWER-CALC - 1) COMPUTE WS-TOTAL-INTEREST = (WS-MONTHLY-PAYMENT * WS-NUM-PAYMENTS) - WS-PRINCIPAL *> Format for European display MOVE WS-PRINCIPAL TO WS-PRINCIPAL-DISP MOVE WS-INTEREST-RATE TO WS-RATE-DISP MOVE WS-MONTHLY-PAYMENT TO WS-PAYMENT-DISP MOVE WS-TOTAL-INTEREST TO WS-INTEREST-DISP DISPLAY "=== EUROPEAN LOAN CALCULATION ===" DISPLAY "Principal: " WS-PRINCIPAL-DISP DISPLAY "Interest Rate: " WS-RATE-DISP DISPLAY "Term: " WS-YEARS " years" DISPLAY "Monthly Payment: " WS-PAYMENT-DISP DISPLAY "Total Interest: " WS-INTEREST-DISP. *> Sample Output: *> Principal: €100.000,00 *> Interest Rate: 5,2500% *> Monthly Payment: €1.076,65 *> Total Interest: €29.198,44

International Report Generation

cobol
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
ENVIRONMENT DIVISION. CONFIGURATION SECTION. SPECIAL-NAMES. DECIMAL-POINT IS COMMA. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-SALES-RECORD. 05 WS-PRODUCT-ID PIC X(10). 05 WS-PRODUCT-NAME PIC X(30). 05 WS-UNIT-PRICE PIC 9(4)V99. 05 WS-QUANTITY PIC 9(4). 05 WS-DISCOUNT-RATE PIC 9V99. 05 WS-LINE-TOTAL PIC 9(7)V99. 05 WS-DISCOUNT-AMOUNT PIC 9(6)V99. 05 WS-NET-AMOUNT PIC 9(7)V99. 01 WS-REPORT-TOTALS. 05 WS-GROSS-TOTAL PIC 9(9)V99 VALUE ZERO. 05 WS-TOTAL-DISCOUNT PIC 9(8)V99 VALUE ZERO. 05 WS-NET-TOTAL PIC 9(9)V99 VALUE ZERO. 01 WS-REPORT-LINE. 05 WS-RPT-PRODUCT PIC X(15). 05 FILLER PIC X VALUE SPACE. 05 WS-RPT-PRICE PIC ZZ9,99. 05 FILLER PIC XX VALUE SPACES. 05 WS-RPT-QTY PIC Z.ZZ9. 05 FILLER PIC XX VALUE SPACES. 05 WS-RPT-DISCOUNT PIC Z9,99%. 05 FILLER PIC XX VALUE SPACES. 05 WS-RPT-NET PIC ZZ.ZZ9,99. PROCEDURE DIVISION. GENERATE-EUROPEAN-SALES-REPORT. PERFORM PRINT-REPORT-HEADER PERFORM PROCESS-SAMPLE-DATA PERFORM PRINT-REPORT-TOTALS STOP RUN. PRINT-REPORT-HEADER. DISPLAY "Product Price Qty Disc% Net Amount" DISPLAY "================================================". PROCESS-SAMPLE-DATA. *> Sample data with European decimal format MOVE "WIDGET-A" TO WS-PRODUCT-ID MOVE "Premium Widget A" TO WS-PRODUCT-NAME MOVE 125,50 TO WS-UNIT-PRICE MOVE 100 TO WS-QUANTITY MOVE 0,10 TO WS-DISCOUNT-RATE PERFORM CALCULATE-LINE-AMOUNTS PERFORM PRINT-DETAIL-LINE MOVE "GADGET-B" TO WS-PRODUCT-ID MOVE "Standard Gadget B" TO WS-PRODUCT-NAME MOVE 75,25 TO WS-UNIT-PRICE MOVE 250 TO WS-QUANTITY MOVE 0,05 TO WS-DISCOUNT-RATE PERFORM CALCULATE-LINE-AMOUNTS PERFORM PRINT-DETAIL-LINE. CALCULATE-LINE-AMOUNTS. COMPUTE WS-LINE-TOTAL = WS-UNIT-PRICE * WS-QUANTITY COMPUTE WS-DISCOUNT-AMOUNT = WS-LINE-TOTAL * WS-DISCOUNT-RATE COMPUTE WS-NET-AMOUNT = WS-LINE-TOTAL - WS-DISCOUNT-AMOUNT ADD WS-LINE-TOTAL TO WS-GROSS-TOTAL ADD WS-DISCOUNT-AMOUNT TO WS-TOTAL-DISCOUNT ADD WS-NET-AMOUNT TO WS-NET-TOTAL. PRINT-DETAIL-LINE. MOVE WS-PRODUCT-NAME(1:15) TO WS-RPT-PRODUCT MOVE WS-UNIT-PRICE TO WS-RPT-PRICE MOVE WS-QUANTITY TO WS-RPT-QTY MOVE WS-DISCOUNT-RATE TO WS-RPT-DISCOUNT MOVE WS-NET-AMOUNT TO WS-RPT-NET DISPLAY WS-REPORT-LINE. PRINT-REPORT-TOTALS. 01 WS-TOTAL-LINE. 05 WS-TOT-GROSS PIC €ZZZ.ZZ9,99. 05 WS-TOT-DISCOUNT PIC €ZZ.ZZ9,99. 05 WS-TOT-NET PIC €ZZZ.ZZ9,99. MOVE WS-GROSS-TOTAL TO WS-TOT-GROSS MOVE WS-TOTAL-DISCOUNT TO WS-TOT-DISCOUNT MOVE WS-NET-TOTAL TO WS-TOT-NET DISPLAY "================================================" DISPLAY "Gross Total: " WS-TOT-GROSS DISPLAY "Total Discount: " WS-TOT-DISCOUNT DISPLAY "Net Total: " WS-TOT-NET.

Compatibility and Considerations

Data Exchange Considerations

cobol
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
58
59
60
61
ENVIRONMENT DIVISION. CONFIGURATION SECTION. SPECIAL-NAMES. DECIMAL-POINT IS COMMA. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-INTERNAL-AMOUNTS. 05 WS-EURO-AMOUNT PIC 9(6)V99 VALUE 12345,67. 05 WS-US-AMOUNT PIC 9(6)V99. 01 WS-EXCHANGE-FORMATS. 05 WS-DISPLAY-EURO PIC ZZ9.ZZ9,99. 05 WS-DISPLAY-US PIC ZZ9,ZZ9.99. 01 WS-STRING-WORK. 05 WS-EURO-STRING PIC X(10). 05 WS-US-STRING PIC X(10). 05 WS-CONVERTED-STRING PIC X(10). PROCEDURE DIVISION. HANDLE-DATA-EXCHANGE. *> Display in European format MOVE WS-EURO-AMOUNT TO WS-DISPLAY-EURO DISPLAY "European format: " WS-DISPLAY-EURO *> Convert for US system exchange PERFORM CONVERT-TO-US-FORMAT *> Display in US format (simulated) MOVE WS-US-AMOUNT TO WS-DISPLAY-US DISPLAY "US format: " WS-DISPLAY-US. CONVERT-TO-US-FORMAT. *> For data exchange, use computational fields *> The internal representation is the same MOVE WS-EURO-AMOUNT TO WS-US-AMOUNT *> For string conversion (if needed) MOVE WS-DISPLAY-EURO TO WS-EURO-STRING PERFORM SWAP-DECIMAL-SEPARATORS MOVE WS-CONVERTED-STRING TO WS-US-STRING. SWAP-DECIMAL-SEPARATORS. *> Convert European format to US format MOVE SPACES TO WS-CONVERTED-STRING INSPECT WS-EURO-STRING TALLYING WS-CHAR-COUNT FOR CHARACTERS PERFORM VARYING WS-INDEX FROM 1 BY 1 UNTIL WS-INDEX > WS-CHAR-COUNT EVALUATE WS-EURO-STRING(WS-INDEX:1) WHEN ',' MOVE '.' TO WS-CONVERTED-STRING(WS-INDEX:1) WHEN '.' MOVE ',' TO WS-CONVERTED-STRING(WS-INDEX:1) WHEN OTHER MOVE WS-EURO-STRING(WS-INDEX:1) TO WS-CONVERTED-STRING(WS-INDEX:1) END-EVALUATE END-PERFORM.

Compiler and Environment Support

cobol
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
ENVIRONMENT DIVISION. CONFIGURATION SECTION. SPECIAL-NAMES. DECIMAL-POINT IS COMMA. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-ENVIRONMENT-INFO. 05 WS-COMPILER-SUPPORT PIC X VALUE 'Y'. 88 DECIMAL-COMMA-SUPPORTED VALUE 'Y'. 05 WS-LOCALE-SETTING PIC X(10). 05 WS-NUMBER-FORMAT PIC X(10). 01 WS-TEST-VALUES. 05 WS-TEST-AMOUNT PIC 9(4)V99 VALUE 1234,56. 05 WS-FORMATTED-AMT PIC Z.ZZ9,99. PROCEDURE DIVISION. VERIFY-DECIMAL-POINT-SUPPORT. *> Test if DECIMAL-POINT IS COMMA is working MOVE WS-TEST-AMOUNT TO WS-FORMATTED-AMT IF WS-FORMATTED-AMT = "1.234,56" SET DECIMAL-COMMA-SUPPORTED TO TRUE MOVE "EUROPEAN" TO WS-NUMBER-FORMAT DISPLAY "DECIMAL-POINT IS COMMA is active" DISPLAY "Formatted amount: " WS-FORMATTED-AMT ELSE MOVE 'N' TO WS-COMPILER-SUPPORT MOVE "US" TO WS-NUMBER-FORMAT DISPLAY "Standard decimal point formatting" DISPLAY "Formatted amount: " WS-FORMATTED-AMT END-IF PERFORM DISPLAY-ENVIRONMENT-INFO. DISPLAY-ENVIRONMENT-INFO. DISPLAY "Environment Information:" DISPLAY "Decimal comma support: " WS-COMPILER-SUPPORT DISPLAY "Number format: " WS-NUMBER-FORMAT *> Additional environment checks ACCEPT WS-LOCALE-SETTING FROM ENVIRONMENT "LOCALE" IF WS-LOCALE-SETTING NOT = SPACES DISPLAY "System locale: " WS-LOCALE-SETTING END-IF.

Related Topics

  • SPECIAL-NAMES Paragraph
  • CONFIGURATION SECTION
  • DE Editing Character
  • PICTURE Clause
  • Numeric Literals
  • International Programming

Frequently Asked Questions

Where do I specify DECIMAL-POINT IS COMMA?

Specify it in the SPECIAL-NAMES paragraph of the CONFIGURATION SECTION in the ENVIRONMENT DIVISION. This affects the entire program's numeric literal interpretation and display formatting.

Does DECIMAL-POINT IS COMMA affect internal storage?

No, it only affects how numeric literals are interpreted in the source code and how edited numeric fields are displayed. Internal storage and arithmetic operations remain the same.

Can I mix US and European formats in the same program?

The DECIMAL-POINT IS COMMA setting applies to the entire program. To handle both formats, use string manipulation or separate programs with different DECIMAL-POINT settings.

Is DECIMAL-POINT IS COMMA supported by all COBOL compilers?

Support varies by compiler and version. It's part of the COBOL standard but may not be implemented in all compilers. Check your compiler documentation for specific support and any limitations.