<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -23,9 +23,9 @@ Assumptions
     ...
 
     # Stuff GeoTools needs:
-    t.integer :latitude_degrees,  :latitude_minutes,  :latitude_decimal_minutes
+    t.integer :latitude_degrees,  :latitude_minutes,  :latitude_decimal_minutes, :latitude_decimal_minutes_width
     t.string  :latitude_hemisphere
-    t.integer :longitude_degrees, :longitude_minutes, :longitude_decimal_minutes
+    t.integer :longitude_degrees, :longitude_minutes, :longitude_decimal_minutes, :longitude_decimal_minutes_width
     t.string  :longitude_hemisphere
   end
 
@@ -42,6 +42,8 @@ Assumptions
   zz is decimal-minutes (0 &lt;= integer &lt;= 99; maximum length of 2 digits; optional; defaults to 0)
   h is hemisphere ('N' or 'S')
 
+  Note with decimal minutes 2, 20 and 200000 are equivalent.  This is because 3.2, 3.20 and 3.200000 are equivalent.
+
 * Similarly, a longitude should be entered on a form like this:
 
   xxx &lt;degree symbol&gt; yy &lt;decimal point&gt; zz h
@@ -92,6 +94,7 @@ To Do
 * Use +method+ in the form helpers so user can give database columns different names (e.g. my_lat_degrees, etc).
   See the way Paperclip allows different attachment names.
 * DRY up form helper methods.
+* DRY up location.rb.
 * Tests/specs :-)
 * Investigate implementing with ActiveRecord's multiparameter assignment.
 </diff>
      <filename>README</filename>
    </modified>
    <modified>
      <diff>@@ -48,7 +48,7 @@ module AirBlade
         width = opts[:decimal_minutes][:maxlength]
         output &lt;&lt; plain_text_field(&quot;latitude_decimal_minutes&quot;,
                              options.merge(:maxlength =&gt; width,
-                                           :value     =&gt; @object.send(&quot;latitude_decimal_minutes&quot;).to_s.ljust(width, '0')))
+                                           :value     =&gt; @object.send(&quot;latitude_decimal_minutes_as_string&quot;).ljust(width, '0')))
         output &lt;&lt; opts[:decimal_minutes][:symbol]
 
         # Hemisphere.
@@ -87,7 +87,7 @@ module AirBlade
         width = opts[:decimal_minutes][:maxlength]
         output &lt;&lt; plain_text_field(&quot;longitude_decimal_minutes&quot;,
                              options.merge(:maxlength =&gt; width,
-                                           :value     =&gt; @object.send(&quot;longitude_decimal_minutes&quot;).to_s.ljust(width, '0')))
+                                           :value     =&gt; @object.send(&quot;longitude_decimal_minutes_as_string&quot;).ljust(width, '0')))
         output &lt;&lt; opts[:decimal_minutes][:symbol]
 
         # Hemisphere.</diff>
      <filename>lib/air_blade/geo_tools/form_helpers.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,3 @@
-# NOTE: Perhaps use ActiveRecord's multiparameter assignment instead.
-#       Cf ActiveRecord::Base#assign_multiparameter_attributes(pairs),
-#          ActiveRecord::Base#execute_callstack_for_multiparameter_attributes(pairs), etc.
 module AirBlade
   module GeoTools
     module Location
@@ -37,6 +34,11 @@ module AirBlade
                                             :message                   =&gt; 'Decimal minutes are invalid',
                                             :for                       =&gt; :latitude
 
+              validates_numericality_of_for :latitude_decimal_minutes_width,
+                                            :only_integer             =&gt; true,
+                                            :greater_than_or_equal_to =&gt; 0,
+                                            :for                      =&gt; :latitude
+
               validates_inclusion_of_for    :latitude_hemisphere,
                                             :in      =&gt; %w( N S ),
                                             :message =&gt; 'Hemisphere is invalid',
@@ -62,6 +64,11 @@ module AirBlade
                                             :message                  =&gt; 'Decimal minutes are invalid',
                                             :for                      =&gt; :longitude
 
+              validates_numericality_of_for :longitude_decimal_minutes_width,
+                                            :only_integer             =&gt; true,
+                                            :greater_than_or_equal_to =&gt; 0,
+                                            :for                      =&gt; :longitude
+
               validates_inclusion_of_for    :longitude_hemisphere,
                                             :in      =&gt; %w( E W ),
                                             :message =&gt; 'Hemisphere is invalid',
@@ -78,12 +85,43 @@ module AirBlade
       end
 
       module InstanceMethods
+
+        def latitude_decimal_minutes=(value)
+          unless value.nil?
+            width = value.to_s.length
+            value = value.to_i
+
+            write_attribute :latitude_decimal_minutes, value
+            write_attribute :latitude_decimal_minutes_width, width
+          end
+        end
+
+        def latitude_decimal_minutes_as_string
+          &quot;%0#{latitude_decimal_minutes_width}d&quot; % latitude_decimal_minutes
+        end
+
+        def longitude_decimal_minutes=(value)
+          unless value.nil?
+            width = value.to_s.length
+            value = value.to_i
+
+            write_attribute :longitude_decimal_minutes, value
+            write_attribute :longitude_decimal_minutes_width, width
+          end
+        end
+
+        def longitude_decimal_minutes_as_string
+          &quot;%0#{longitude_decimal_minutes_width}d&quot; % longitude_decimal_minutes
+        end
+
         def latitude
-          to_float latitude_degrees, latitude_minutes, latitude_decimal_minutes, latitude_hemisphere
+          to_float latitude_degrees, latitude_minutes, latitude_decimal_minutes,
+                   latitude_decimal_minutes_width, latitude_hemisphere
         end
 
         def longitude
-          to_float longitude_degrees, longitude_minutes, longitude_decimal_minutes, longitude_hemisphere
+          to_float longitude_degrees, longitude_minutes, longitude_decimal_minutes,
+                   longitude_decimal_minutes_width, longitude_hemisphere
         end
 
         def to_s
@@ -92,13 +130,13 @@ module AirBlade
 
           lat_fields = [&quot;%02d&quot; % latitude_degrees,
                         &quot;%02d&quot; % latitude_minutes,
-                        latitude_decimal_minutes.to_s.ljust(2, '0'),
+                        latitude_decimal_minutes_as_string.ljust(2, '0'),
                         latitude_hemisphere]
           lat = lat_fields.zip(units).map{ |f| f.join }.join
 
           long_fields = [&quot;%02d&quot; % longitude_degrees,
                          &quot;%02d&quot; % longitude_minutes,
-                         longitude_decimal_minutes.to_s.ljust(2, '0'),
+                         longitude_decimal_minutes_as_string.ljust(2, '0'),
                          longitude_hemisphere]
           long = long_fields.zip(units).map{ |f| f.join }.join
 
@@ -107,14 +145,14 @@ module AirBlade
 
         private
 
-        def to_float(degrees, minutes, decimal_minutes, hemisphere)
+        def to_float(degrees, minutes, decimal_minutes, decimal_minutes_width, hemisphere)
           return nil if degrees.nil? and minutes.nil? and decimal_minutes.nil?
           degrees ||= 0
           minutes ||= 0
           decimal_minutes ||= 0
 
           f = degrees.to_f
-          f = f + (minutes.to_f + decimal_minutes.to_f / 10 ** decimal_minutes.to_s.length) / 60.0
+          f = f + (minutes.to_f + decimal_minutes.to_f / 10 ** decimal_minutes_width) / 60.0
           f = f * -1 if hemisphere == 'S' or hemisphere == 'W'
           f
         end</diff>
      <filename>lib/air_blade/geo_tools/location.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>17a616f99535e941308344d604356ba4dcf2d513</id>
    </parent>
  </parents>
  <author>
    <name>Andy Stewart</name>
    <email>boss@airbladesoftware.com</email>
  </author>
  <url>http://github.com/airblade/geo_tools/commit/2d326316cbb5e1b997fac1a5c7bfb5ccc63ddbee</url>
  <id>2d326316cbb5e1b997fac1a5c7bfb5ccc63ddbee</id>
  <committed-date>2009-01-12T06:40:28-08:00</committed-date>
  <authored-date>2009-01-12T06:40:28-08:00</authored-date>
  <message>Fixed bug where leading zeros of decimal minutes were ignored.</message>
  <tree>d05f945e96b7b1f46dbb2f65258b2b48bb3d5ae2</tree>
  <committer>
    <name>Andy Stewart</name>
    <email>boss@airbladesoftware.com</email>
  </committer>
</commit>
