Index: django/contrib/localflavor/nl/forms.py
===================================================================
--- django/contrib/localflavor/nl/forms.py	(revision 8104)
+++ django/contrib/localflavor/nl/forms.py	(working copy)
@@ -11,6 +11,7 @@
 
 pc_re = re.compile('^\d{4}[A-Z]{2}$')
 sofi_re = re.compile('^\d{9}$')
+bank_re = re.compile('^\d{9}$')
 numeric_re = re.compile('^\d+$')
 
 class NLZipCodeField(Field):
@@ -98,3 +99,41 @@
             raise ValidationError(self.error_messages['invalid'])
 
         return value
+
+class NLBankAccountNumberField(Field):
+    """
+    A Dutch back account number field (this excludes Postbank accounts, they
+    have no 11-check and these numbers will probably be converted on
+    01-01-2009).
+    
+    People tend to use space or point seperators in Dutch bank account numbers
+    like this: 12.34.56.789. This field strips these seperators and leaves this
+    formatting to the "presentation layer".
+
+    http://nl.wikipedia.org/wiki/Bankrekeningnummer
+    """
+    default_error_messages = {
+        'invalid': _('Enter a valid Dutch bank account number'),
+    }
+
+    def clean(self, value):
+        super(NLBankAccountNumberField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+
+        value = value.replace(' ', '').replace('.', '')
+
+        if not bank_re.search(value):
+            raise ValidationError(self.error_messages['invalid'])
+
+        if int(value) == 0:
+            raise ValidationError(self.error_messages['invalid'])
+
+        checksum = 0
+        for i in range(1, 10):
+            checksum += int(value[9-i]) * i
+
+        if checksum % 11 != 0:
+            raise ValidationError(self.error_messages['invalid'])
+
+        return value
Index: tests/regressiontests/forms/localflavor/nl.py
===================================================================
--- tests/regressiontests/forms/localflavor/nl.py	(revision 8104)
+++ tests/regressiontests/forms/localflavor/nl.py	(working copy)
@@ -63,6 +63,31 @@
     ...
 ValidationError: [u'Enter a valid SoFi number']
 
+# NLBankAccountNumberField #########################################################
+
+>>> from django.contrib.localflavor.nl.forms import NLBankAccountNumberField
+>>> f = NLBankAccountNumberField(required=False)
+>>> f.clean('')
+u''
+>>> f.clean('12.34.56.789')
+'123456789'
+>>> f.clean('12 34 56 789')
+'123456789'
+>>> f.clean('123456789')
+'123456789'
+>>> f.clean('000000000')
+Traceback (most recent call last):
+    ...
+ValidationError: [u'Enter a valid Dutch bank account number']
+>>> f.clean('123456788')
+Traceback (most recent call last):
+    ...
+ValidationError: [u'Enter a valid Dutch bank account number']
+>>> f.clean('foo')
+Traceback (most recent call last):
+    ...
+ValidationError: [u'Enter a valid Dutch bank account number']
+
 # NLProvinceSelect ##########################################################
 
 >>> from django.contrib.localflavor.nl.forms import NLProvinceSelect
Index: django/contrib/localflavor/nl/forms.py
===================================================================
--- django/contrib/localflavor/nl/forms.py	(revision 8104)
+++ django/contrib/localflavor/nl/forms.py	(working copy)
@@ -11,6 +11,7 @@
 
 pc_re = re.compile('^\d{4}[A-Z]{2}$')
 sofi_re = re.compile('^\d{9}$')
+bank_re = re.compile('^\d{9}$')
 numeric_re = re.compile('^\d+$')
 
 class NLZipCodeField(Field):
@@ -98,3 +99,40 @@
             raise ValidationError(self.error_messages['invalid'])
 
         return value
+
+class NLBankAccountNumberField(Field):
+    """
+    A Dutch bank account number field (this excludes Postbank accounts, they
+    have no 11-check and use a different format).
+    
+    People tend to use space or point seperators in Dutch bank account numbers
+    like this: 12.34.56.789. This field strips these seperators and leaves this
+    formatting to the "presentation layer".
+
+    http://nl.wikipedia.org/wiki/Bankrekeningnummer
+    """
+    default_error_messages = {
+        'invalid': _('Enter a valid Dutch bank account number'),
+    }
+
+    def clean(self, value):
+        super(NLBankAccountNumberField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+
+        value = value.replace(' ', '').replace('.', '')
+
+        if not bank_re.search(value):
+            raise ValidationError(self.error_messages['invalid'])
+
+        if int(value) == 0:
+            raise ValidationError(self.error_messages['invalid'])
+
+        checksum = 0
+        for i in range(1, 10):
+            checksum += int(value[9-i]) * i
+
+        if checksum % 11 != 0:
+            raise ValidationError(self.error_messages['invalid'])
+
+        return value
Index: tests/regressiontests/forms/localflavor/nl.py
===================================================================
--- tests/regressiontests/forms/localflavor/nl.py	(revision 8104)
+++ tests/regressiontests/forms/localflavor/nl.py	(working copy)
@@ -63,6 +63,31 @@
     ...
 ValidationError: [u'Enter a valid SoFi number']
 
+# NLBankAccountNumberField #########################################################
+
+>>> from django.contrib.localflavor.nl.forms import NLBankAccountNumberField
+>>> f = NLBankAccountNumberField(required=False)
+>>> f.clean('')
+u''
+>>> f.clean('12.34.56.789')
+'123456789'
+>>> f.clean('12 34 56 789')
+'123456789'
+>>> f.clean('123456789')
+'123456789'
+>>> f.clean('000000000')
+Traceback (most recent call last):
+    ...
+ValidationError: [u'Enter a valid Dutch bank account number']
+>>> f.clean('123456788')
+Traceback (most recent call last):
+    ...
+ValidationError: [u'Enter a valid Dutch bank account number']
+>>> f.clean('foo')
+Traceback (most recent call last):
+    ...
+ValidationError: [u'Enter a valid Dutch bank account number']
+
 # NLProvinceSelect ##########################################################
 
 >>> from django.contrib.localflavor.nl.forms import NLProvinceSelect
Index: django/contrib/localflavor/nl/forms.py
===================================================================
--- django/contrib/localflavor/nl/forms.py	(revision 8104)
+++ django/contrib/localflavor/nl/forms.py	(working copy)
@@ -11,6 +11,7 @@
 
 pc_re = re.compile('^\d{4}[A-Z]{2}$')
 sofi_re = re.compile('^\d{9}$')
+bank_re = re.compile('^\d{9}$')
 numeric_re = re.compile('^\d+$')
 
 class NLZipCodeField(Field):
@@ -98,3 +99,40 @@
             raise ValidationError(self.error_messages['invalid'])
 
         return value
+
+class NLBankAccountNumberField(Field):
+    """
+    A Dutch bank account number field (this excludes Postbank accounts, they
+    have no 11-check and use a different format).
+    
+    People tend to use space or point seperators in Dutch bank account numbers
+    like this: 12.34.56.789. This field strips these seperators and leaves this
+    formatting to the "presentation layer".
+
+    http://nl.wikipedia.org/wiki/Bankrekeningnummer
+    """
+    default_error_messages = {
+        'invalid': _('Enter a valid Dutch bank account number'),
+    }
+
+    def clean(self, value):
+        super(NLBankAccountNumberField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+
+        value = value.replace(' ', '').replace('.', '')
+
+        if not bank_re.search(value):
+            raise ValidationError(self.error_messages['invalid'])
+
+        if int(value) == 0:
+            raise ValidationError(self.error_messages['invalid'])
+
+        checksum = 0
+        for i in range(1, 10):
+            checksum += int(value[9-i]) * i
+
+        if checksum % 11 != 0:
+            raise ValidationError(self.error_messages['invalid'])
+
+        return value
Index: tests/regressiontests/forms/localflavor/nl.py
===================================================================
--- tests/regressiontests/forms/localflavor/nl.py	(revision 8104)
+++ tests/regressiontests/forms/localflavor/nl.py	(working copy)
@@ -63,6 +63,31 @@
     ...
 ValidationError: [u'Enter a valid SoFi number']
 
+# NLBankAccountNumberField #########################################################
+
+>>> from django.contrib.localflavor.nl.forms import NLBankAccountNumberField
+>>> f = NLBankAccountNumberField(required=False)
+>>> f.clean('')
+u''
+>>> f.clean('12.34.56.789')
+'123456789'
+>>> f.clean('12 34 56 789')
+'123456789'
+>>> f.clean('123456789')
+'123456789'
+>>> f.clean('000000000')
+Traceback (most recent call last):
+    ...
+ValidationError: [u'Enter a valid Dutch bank account number']
+>>> f.clean('123456788')
+Traceback (most recent call last):
+    ...
+ValidationError: [u'Enter a valid Dutch bank account number']
+>>> f.clean('foo')
+Traceback (most recent call last):
+    ...
+ValidationError: [u'Enter a valid Dutch bank account number']
+
 # NLProvinceSelect ##########################################################
 
 >>> from django.contrib.localflavor.nl.forms import NLProvinceSelect
