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.
12345678ENVIRONMENT 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
1234567891011121314151617181920212223242526ENVIRONMENT 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.
1234567891011121314151617181920212223242526272829303132333435363738394041ENVIRONMENT 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
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758ENVIRONMENT 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
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394ENVIRONMENT 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.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061ENVIRONMENT 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.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546ENVIRONMENT 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.
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.
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.
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.
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.