with String_Utilities;
package body Dollars_And_Cents is

    function Value (String_Image : String) return Dollars is
        Money : Dollars := 0;
        Decimal : Natural := String_Utilities.Locate (".", String_Image);
        Cents : Integer;
        Dollrs : Integer;
        Worked : Boolean;
    begin
        String_Utilities.String_To_Number
           (String_Image (String_Image'Last - 1 .. String_Image'Last),
            Cents, Worked);
        if String_Image (1) = '$' then
            String_Utilities.String_To_Number
               (String_Image (String_Image'First + 1 .. String_Image'Last - 3),
                Dollrs, Worked);
        else
            String_Utilities.String_To_Number
               (String_Image (String_Image'First .. String_Image'Last - 3),
                Dollrs, Worked);
        end if;

        return Dollars ((Dollrs * 100) + Cents);
    end Value;

    function Image (D : Dollars;  
                    Field_Width : Positive;  
                    Add_Dollar_Sign : Boolean := True) return String is
        Dollrs : Dollars := (D / 100);
        Cents : Dollars := D - Dollrs * 100;
        D_Imag : constant String := String_Utilities.Number_To_String
                                       (Integer (Dollrs), 10, Field_Width);
        C_Imag : constant String := String_Utilities.Number_To_String
                                       (Integer (Cents), 10, 2, '0');
    begin
        if Add_Dollar_Sign then
            return "$" & D_Imag & "." & C_Imag;
        else
            return D_Imag & "." & C_Imag;
        end if;
    end Image;

    function "+" (D1, D2 : Dollars) return Dollars is
    begin
        return Dollars (Integer (D1) + Integer (D2));
    end "+";

    function "-" (D1, D2 : Dollars) return Dollars is
    begin
        return Dollars (Integer (D1) - Integer (D2));
    end "-";
end Dollars_And_Cents;