|
|
Como Calcular el Digito de Control de una Cuenta Corriente en PHP
(223071 lectures)
Por Gabriel
Gigi
(http://www.degabriel.es)
Creado el 28/06/2002 20:35 modificado el 28/06/2002 20:35
|
Vamos a ver como calcular ese digito de Control para validar numeros de Cuentas Corrientes. Quizas a muchos no les sirva para nada, pero quien tenga que programar este control, le podra venir de perlas | Pagina1/1 |
Como ejemplo, cogeremos los datos de la cuenta de Asociación de Bulma que la tenemos en La Caixa:
Nombre de la Cuenta: ASOCIACION BULMA
Numero completo de la Cuenta: 2100-0150-63-0200455826
Que significa:
Entidad: 2100 La Caixa
Oficina: 0150 Santa Catalina
DC : 63
Cuenta : 0200455826
Primero de todo vamos a empezar creando la función en PHP que usaremos para validar los datos de la Cuenta Corriente:
Function CalculoCC($IentOfi,$InumCta)
{
$APesos = Array(1,2,4,8,5,10,9,7,3,6); // Array de "pesos"
$DC1=0;
$DC2=0;
$x=8;
while($x>0) {
$digito=$IentOfi[$x-1];
$DC1=$DC1+($APesos[$x+2-1]*($digito));
$x = $x - 1;
}
$Resto = $DC1%11;
$DC1=11-$Resto;
if ($DC1==10) $DC1=1;
if ($DC1==11) $DC1=0; // Dígito control Entidad-Oficina
$x=10;
while($x>0) {
$digito=$InumCta[$x-1];
$DC2=$DC2+($APesos[$x-1]*($digito));
$x = $x - 1;
}
$Resto = $DC2%11;
$DC2=11-$Resto;
if ($DC2==10) $DC1=1;
if ($DC2==11) $DC1=0; // Dígito Control C/C
$DigControl=($DC1)."".($DC2); // los 2 números del D.C.
return $DigControl;
}
Ahora ya tenemos la función hecha.
Para que funcione simplemente la llamaremos de la siguiente forma pasandole los parametros del formulario:
$parte1=$cc1."".$cc2;
$parte2=$cc4;
$mensaje="No es correcto los Datos Bancarios";
$cc="";
if (($cc1<>"") && ($cc2<>"") && ($cc3<>"") && ($cc4<>"") ){
$resultado=CalculoCC($parte1,$parte2);
if ($resultado==$cc3){
$mensaje="Datos Bancarios Correctos";
$cc=$cc1."-".$cc2."-".$cc3."-".$cc4;
}
}
echo $mensaje;
Y para acabar, ponemos un ejemplo de formulario para poder usar estos ejemplo:
Nota:
Podeis emplear algo de JavaScript para comprobar que los valores del formulario tienen datos, pero eso os lo dejo a vosotros.
Podeis encontrar mas información en:
http://www.grupoalbor.com/Ideas/IdeasD/Delphi4.htm
http://www.abanfin.com/dirfinan/negociacion/ccc.htm |
|
|
|
|
|
Comentarios Es posible que se hayan omitido algunos comentarios considerados poco constructivos
| 1. Lo mismo en python (28/06/2002 23:46, #7038) Por: chemacorte (http://zaralinux.org) |
Por si alguien quiere comparar, aquí tengo la rutina en python:
def _CRC(cTexto):
"""Cálculo del CRC de un número de 10 dígitos
ajustados con ceros por la izquierda"""
factor=(1,2,4,8,5,10,9,7,3,6)
# Cálculo CRC
nCRC=0
for n in range(10):
nCRC += int(cTexto[n])*factor[n]
# Reducción del CRC a un dígito
nValor=11 - nCRC%11
if nValor==10: nValor=1
elif nValor==11: nValor=0
return nValor
def CalcCC(cBanco,cSucursal,cCuenta):
"""Cálculo del Código de Control Bancario"""
cTexto="00%04d%04d" % (int(cBanco),int(cSucursal))
DC1=_CRC(cTexto)
cTexto="%010d" % long(cCuenta)
DC2=_CRC(cTexto)
return "%1d%1d" % (DC1,DC2)
|
|
2. En java (16/09/2002 13:11, #8468) Por: El cobarde anónimorl |
Traducción del código en PHP que aparece aquí:
public static int getControlDigits(String office, String account)
{
final int OFFICE_LENGTH = 8;
final int ACCOUNT_LENGTH = 10;
final int[] WEIGHTS = new int[] {1, 2, 4, 8, 5, 10, 9, 7, 3, 6};
int officeControl = 0;
int accountControl = 0;
for (int i=0; i<OFFICE_LENGTH; i++)
{
int digit = Integer.parseInt("" + office.charAt(i));
officeControl += digit * WEIGHTS[i + 2];
}
int remainder = officeControl % 11;
officeControl = 11 - remainder;
if (officeControl >= 10) officeControl = remainder;
for (int i=0; i<ACCOUNT_LENGTH; i++)
{
int digit = Integer.parseInt("" + account.charAt(i));
accountControl += digit * WEIGHTS[i];
}
remainder = accountControl % 11;
accountControl = 11 - remainder;
if (accountControl >= 10) accountControl = remainder;
return officeControl * 10 + accountControl;
} |
|
3. Re: En java (16/09/2002 13:13, #8469) Por: El cobarde anónimorl |
Por si no se ve!
Lo anterior era la traducción a un método estático en java, pero no es obligatorio que sea 'static'. |
|
4. En Java J2ME (para el movil) (07/01/2006 20:57, #30399) Por: Urreta |
Aviso que es el primer programa java que "hago", bueno he adaptado el script java de arriba y lo he añadido a un programa de un tutotial sobre j2me, y funciona ;-)
El programa espera los 20 digitos de la cuenta y te dice si es correcta o erronea. Pueden existir partes del código que no sirvan para nada, si eres capaz de limpiarlo mejor espero tu aporación.
Si quereis descargaros el archivo jad (desde el movil) teneis un enlace en:
http://urrezabal.utilitas.org/wap/
los archivos en cuestion son:
http://urrezabal.utilitas.org/wap/CuentaBancaria.jad
http://urrezabal.uti litas.org/wap/CuentaBancaria.jar
código fuente
=============
import java.io.*;
import javax.microedition.io.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class CuentaBancaria extends MIDlet
implements CommandListener, Runnable {
private Display mDisplay;
private Command mExitCommand, mFindCommand, mCancelCommand;
private TextBox mSubmitBox;
private Form mProgressForm;
private StringItem mProgressString;
public CuentaBancaria() {
mExitCommand = new Command("Salir", Command.EXIT, 0);
mFindCommand = new Command("Comprobar", Command.SCREEN, 0);
mCancelCommand = new Command("Cancelar", Command.CANCEL, 0);
mSubmitBox = new TextBox("Cuenta Bancaria", "", 20, TextField.NUMERIC);
mSubmitBox.addCommand(mExitCommand);
mSubmitBox.addCommand(mFindCommand);
mSubmitBox.setCommandListener(this);
mProgressForm = new Form("Procesando...");
mProgressString = new StringItem(null, null);
mProgressForm.append(mProgressString);
}
public void startApp() {
mDisplay = Display.getDisplay(this);
mDisplay.setCurrent(mSubmitBox);
}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
public void commandAction(Command c, Displayable s) {
if (c == mExitCommand) {
destroyApp(false);
notifyDestroyed();
}
else if (c == mFindCommand) {
// Show the progress form.
mDisplay.setCurrent(mProgressForm);
// Kick off the thread to do the query.
Thread t = new Thread(this);
t.start();
}
}
public void run() {
String ccc = mSubmitBox.getString();
String resultado;
resultado = comprobar(ccc);
Alert results = new Alert("Comprobación", resultado,
null, null);
results.setTimeout(Alert.FOREVER);
mDisplay.setCurrent(results, mSubmitBox);
}
public String comprobar(String ccc)
{
final int[] WEIGHTS = new int[] {1, 2, 4, 8, 5, 10, 9, 7, 3, 6};
int dc = Integer.parseInt("" + ccc.charAt(8)) * 10 + Integer.parseInt("" + ccc.charAt(9));
int officeControl = 0;
int accountControl = 0;
for (int i=0; i= 10) officeControl = remainder;
for (int i=10; i= 10) accountControl = remainder;
if (dc == officeControl * 10 + accountControl){
return "CORRECTA";
}
else{
return "ERRONEA";
}
}
} |
|
5. Re: En Java J2ME (para el movil) (07/01/2006 21:03, #30402) Por: Urreta |
Al código le faltan partes, lo teneis completo en:
http://urrezabal.uti litas.org/wap/CuentaBancaria.java |
|
6. Re: En Java J2ME (para el movil) (12/03/2006 19:48, #31413) Por: luis |
| me gustaria saber como puedo uinstalar este programa en las aplicaciones de mi movil si podeis informarme hacerlo a gennius27103101@hotmail.com gracias |
|
|
|
7. Re: Lo mismo en python (08/03/2003 11:37, #12660) Por: PalmaNova |
| Qué manía con el python con lo feo que es! |
|
|
|
9. Re: Lo mismo en python (31/08/2004 13:42, #23086) Por: Anónimo |
def _CRC(cTexto):
factor=(1,2,4,8,5,10,9,7,3,6)
nV alor=11-reduce(int.__add__, [int(x)*y for x,y in zip(cTexto,factor)])%11
if nValor==10: nValor=1
 elif nValor==11: nValor=0
return nValor
def CalcCC(cOficina,cCuenta):
return "%1d%1d" % (_CRC(cOficina),_CRC(cCuenta)) |
|
|
10. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (29/06/2002 08:50, #7039) Por: Luisito (http://pasando_de_dar_webs_q_no_sirven_para_nada.com) |
| Esta chulo tu programa y demas, pero podrias haber explicado que hace, para los que no sepan php podamos saber que tenemos que hacer en cualquier lenguaje |
|
11. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (29/06/2002 18:37, #7050) Por: Antoni Aloy |
Extret de la documentació de una norma bancària:
"Los dígitos de control verifican los códigos de Entidad y Oficina, el primero, y el número de cuenta, el segundo
Para la obtenció de cada uno de ellos, se utiliza el modulo 11: la suma de los productos obtenidos al multiplicar cada una de las cifras componentes de los elementos por los pesos asignados, se divide entre 11; el resto de lat división se deduce de 11, cuyo resultado es el dígito de control, con las excepciones siguientes: si fuese 10, se considerará 1, y si fera 11, cero."
Per mi que fins i tot estan més clars els codis font dels programes que s'adjunten.
Read the source, Luke!
Per una altra banda i com es pot comprovar el codi Python es força més legible que el PHP (de fet m'atreviria dir que més que qualsevol altre ;D )
|
|
12. no fumadores (04/02/2007 20:40, #38269) Por: sonia (http://calculo) |
| nada de nada porkerias |
|
|
13. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (01/07/2002 10:44, #7072) Por: Capsize |
| Si os interesa yo tengo el de la Seguridad Social y el de los CIF. Ya direis cosas. Pos lo tengo en VB ya que en el curro es donde lo usamos y no tenemos otra cosa. |
|
14. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (01/07/2002 16:21, #7076) Por: Gigi (http://www.navegalia.com/personal/gginard/mispag.htm) |
| El de la Seguridad Social, no lo he empleado. Pero para calcular el NIF, si buscas en Google encontraras muchos codigos, aunque me quedo con el siguiente por su sencillez hecho en JavaScript:
<HTML>
<HEAD>
<TITLE>Calculo del NIF</TITLE>
<script language=JavaScript>
function calcularletra ()
{
var cadena = 'TRWAGMYFPDXBNJZSQVHLCKET';
var posicion = vdni.value % 23;
vletra.value=cadena.charAt(posicion);
}
</script>
</HEAD>
<BODY>
<p align=center>
D.N.I: <input maxlength=10 name=vdni size=20> - <input maxlength=2 name=vletra size=6>
</p>
<p align=center>
<input name="Calcular la Letra" onClick="calcularletra ();" type=button value="Calcular la Letra">
</BODY>
</HTML>
|
|
15. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (01/07/2002 16:56, #7081) Por: Capsize |
| Esto calcula el nif, muy bien, pero yo hablo del CIF |
|
|
16. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (01/07/2002 16:22, #7077) Por: chemacorte (http://zaralinux.org) |
Yo también tengo en python el cálculo del NIF (persona física, nacional y extranjera, y persona jurídica). De momento, hasta que lo ponga en un lugar mejor, se puede descargar de http://es.groups.yahoo.com/group/python-es/files/chemacortes/
No tengo código para calcular el código de control del número de la seguridad social, pero creo recordar que era tan simple como calcular el módulo 97,¿no?
Todos estas rutinas las he pasado desde VB, que a su vez son conversiones desde Clipper. |
|
17. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (01/07/2002 16:55, #7080) Por: Capsize |
| Si, yo tb las tengo de clipper pasadas a VB, y la que tengo no es del NIF sino del CIF, A07016991. por ejemplo. el ultimo digito es el de control. |
|
18. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (02/07/2002 10:32, #7096) Por: chemacorte (http://zaralinux.org) |
| Pues sí que me interesaría el cálculo del CIF. Nunca se sabe cuándo te hará falta. |
|
19. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (02/07/2002 11:26, #7098) Por: Capsize |
Pos ahi te va el listado en clipper pero es facil adaptarlo a lo que quieras.
FUNCTION ChkCifNa(cCif)
LOCAL lOk,cDc,a,res,i,j,k
LOCAL cc[7],nc[7],b[4],bb[4]
LOCAL c,d
IF LEN(cCif)8
lOk:=.f.
ELSE
cDc:=RIGHT(cCif,1)
for i:=1 to 7
cc[i]:=SUBSTR(cCif,i,1)
next i
for j:=1 to 7
nc[j]:=VAL(cc[j])
next j
a:=nc[2]+nc[4]+nc[6]
b[1]:=strzero(nc[1]*2,2)
b[2]:=strzero(nc[3]*2,2)
b[3]:=strzero(nc[5]*2,2)
b[4]:=strzero(nc[7]*2,2)
for k:=1 to 4
bb[k]:=VAL(LEFT(b[k],1))+VAL(RIGHT(b[k],1))
next k
res:=bb[1]+bb[2]+bb[3]+bb[4]
c:=a+res
d:=10-(val(right(strzero(c,2),1)))
if d==10
d:=0
endif
IF right(str(d,2),1)==cDc
lOk:=.t.
ELSE
lOk:=.f.
ENDIF
ENDIF
RETURN(lOk) |
|
20. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (02/07/2002 11:27, #7099) Por: Capsize |
| Se me olvidaba, como parametro a la funcion se le pasa el CIF sin la letra, por ejemplo: A07016991, se le pasa, 07016991, y te devulve .t. o .f. si es correcto el cif o no. Saludos |
|
21. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (03/07/2002 15:27, #7116) Por: chemacorte (http://zaralinux.org) |
| Si no estoy equivocado, es justamente la fórmula de Luhn que se dice en otro de los comentarios. |
|
|
|
22. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (02/07/2002 09:54, #7095) Por: Susana |
Nos interesa el de la Seguridad Social.
Si nos dices donde se puede descargar o si no, si nos lo puedes enviar a susanamnc@mixmail.com, te lo agradecemos. |
|
23. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (01/08/2002 10:37, #7508) Por: Xtina |
Hola necesito el código par avalidar el Número de la Seguridad Social
y no lo encuentro por ninguna parte.
¿Me lo podeis enviar a la cuenta XtinaPim@hotmail.com?
Muchas Gracias |
|
24. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (22/01/2003 16:33, #11673) Por: El Jose y el Paco |
| Y no serías capaz de mandarnos el código...
Nos tienen pillados por los huevos porque tenemos que meter una validación de CIF en VB.
Mándalo a bbvinfor.d320js5@grupobbva.com si quieres...
Salu2, compañero. |
|
25. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (28/10/2003 13:02, #17707) Por: El cobarde anónimo |
| Me podrías enviar el de calculo del dígito de la seguridad social.
Gracias, y un saludo. |
|
26. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (25/05/2004 01:23, #21438) Por: digarme |
| Soy formador y esa clase de ejercicio me vienen muy bien para mis clases se me pudieras enviar las explicaciones mis alumnos estarian encamtados de hacer el programa. Gracias formacion@digarme.com |
|
27. Calcular el NIF, el CIF y el NIE (15/12/2005 10:01, #30037) Por: dj Rulas |
Necesito saber el codigo fuente para validar el NIF y el CIF. Y si tuviese también algo por ahí para calcular el NIE, se lo agradecería mucho.
Mi correo: superdjrulas@hotmail.com
Gracias.
Un Saludo.
|
|
|
28. Y sobre tarjetas de crédito... (01/07/2002 15:46, #7074) Por: pnongrata |
Podéis mirar en esta página donde explican qué es la "fórmula de Luhn":
http://www.webopedia.com/TERM/L/Luhn_formula.html |
|
29. Re: Y sobre tarjetas de crédito... (02/07/2002 10:44, #7097) Por: chemacorte (http://zaralinux.org) |
def luhn(nCard):
····nSum=0
····nRest=nCard
····while nRest>0:
········# Odd position
········nRest,nDigit=divmod(nRest,10)
········nSum+=nDigit
········# Even position
········nRest,nDigit=divmod(nRest,10)
········if nDigit<5:
············nSum+=2*nDigit
········else:
··········· ·nSum+=2*n Digit-9 # Reducing to one digit
····return nSum%10
def check_card(nCard):
····"""Return true if the credit-card number is valid"""
····return luhn(nCard)==0 |
|
|
30. Como Calcular el Digito de Control de una Cuenta Corriente en C++ (16/07/2002 12:33, #7276) Por: Fede (http://facturalux.org) |
Hola en el proyecto FacturaLUX tenemos una versión del calculo del DC en C++, os lo pego aquí:
/** Obtiene el número del digito de control, para cuentas bancarias.
Los números de las cuentas corrientes se organizan de la forma siguiente:
4 Digitos----->Código del banco (ej. 0136 Banco Arabe español)
4 Digitos----->Código de la oficina
1 Digito de control------>de los 8 primeros digitos
1 Digito de control------>del número de cuenta (de los 10 ultimos digitos)
10 Digitos del número de la cuenta
Para comprobar el numero de cuenta se pasa primero los 8 primeros digitos
obteniendo asi el primer digito de control, después se pasan los 10 digitos
del número de la cuenta obteniendo el segundo digito de control.
@param n Número del que se debe obtener el dígito de control
@return Caracter con el dígito de control asociado al número dado */
static QChar calcularDC (const QString & n);
QChar
FLUtil::calcularDC (const QString & n)
{
int Tabla[10] = {6,3,7,9,10,5,8,4,2,1};
int DC, Suma = 0, nDigitos;
nDigitos = n.length () - 1;
for (uint ct = 1; ct
{
Suma += Tabla[nDigitos] * (n[ct - 1] - '0');
nDigitos--;
}
DC = 11 - (Suma % 11);
if (DC == 11)
DC = 0;
else if (DC == 10)
DC = 1;
return QChar::QChar (DC + 48);
}
En la clase FLUtil del proyecto hay otras rutinas para calcular la letra del NIF o para pasar un numero a su forma hablada, p.e 124 lo pasaría a "ciento veinticuatro".
Saludos
Federico Albujer Zornoza |
|
31. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (30/09/2002 01:20, #8762) Por: Isleño |
| Necesito la fórmula para calcular el número de la seguridad
social y la fórmula para calcular el número de una tarjeta de crédito, agradecería que alguien me lo enviara a:
zoti@canariastelecom.com
muchas gracias y un saludo |
|
32. CALCULAR DIGITOS DE CONTROL DE LA SEGURIDAD SOCIAL (03/10/2002 02:53, #8849) Por: El cobarde anónimo |
Es muy sencillo calcularlo:
Para los ke tengan la targeta antigua tendran algo como esto: 38+[Nº s.s.]+B ó T (Titular o Beneficiario)
D.C.= Digitos de control (2 digitos)
Y las nuevas targetas son asi: 3800+[Nº s.s.]+D.C.
Entonces para calcular el DC sera asi:
DC= 380[Nº s.s] mod 97
Ejemplo:
Nº s.s= 234586
DC= 380234586 mod 97= 18
Con lo ke kedaria: 380023458618 y ya ta :)
Codigo en C:
#include
void main(void)
{
int DC=0; //Digitos de control
long int num_ss; //numero seguridad social
printf("Introduzca el numero: ");
scanf("%d", &num_ss);
DC= num_ss % 97; //Calculo del modulo
printf("\nResultado: %d", DC);
} |
|
33. Re: CALCULAR DIGITOS DE CONTROL DE LA SEGURIDAD SOCIAL (03/10/2002 02:57, #8850) Por: el ke puso el msj |
se ve ke no sale la libreria del include, es la tipica: stdio.h
No me deja ponerla con mayor ke ni menor ke. Seria asi pero sustituyendo los corchetes por menor ke y mayor ke:
#include [stdio.h] |
|
|
34. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (28/10/2003 13:00, #17706) Por: El cobarde anónimo |
| Necesito la fórmula para calcular el número de la seguridad social, programo en visual Basic, ¿me podrías ayudar?
Es que no sé, ni encuentro, como coño se calcula.
Un saludo. |
|
35. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (09/07/2004 13:51, #22297) Por: Javier PDFNET (http://www.pdfnet.org) |
| El problema que yo me he encontrado al hacerlo en vba y visual basic es que el operador mod me da overflow por mas que lo convierta todo a doble.
De manera que he tenido que hacer el mod "a mano" formateando el resultado para que aparezca siempre con dos posiciones:
Dim sDigControl as String
Dim dNumSS as double
dNumSS= aqui un numero de Seg. Social con provincia
sDigControl = Format(dNumSS - (Int(dNumSS / 97) * 97),"00")
Que es equivalente a:
sDigControl = dNumSS mod 97
En la mayoria de las ocasiones funciona, pero tengo algun caso que no da bien el resultado, como ocurre con este:
4100646873 que deberia dar 89 y con este calculo da 03.
¿Alguien sabe como tratar estos casos?, he visto por ahi algun programa que valida el digito de control y lo hacen bien, pero este algoritmo no lo calcula bien en estos casos.
Saludos. |
|
36. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (19/09/2004 12:01, #23335) Por: Javier PDFNET (http://www.pdfnet.org) |
Resuelto:
'////////Calculo numero de seguridad social:
'//El numero completo se divide en PPXNNNNNCC
'//Donde:
'//PP =Codigo de la provincia
'//XNNNNN=Numero de orden de la seguridad social
'// donde X =Sera 1 o 0. Si es 0, hay que quitarlo antes de hacer el calculo del digito de control
'//CC =Digito de control, de longitud 2
'//El digito de control sera el modulo 97 del codigo de la provincia y el numero de orden
'//Si el tercer digito tiene un 0, lo quitamos y nos quedamos con un digito menos
If Mid(argNumSS, 3, 1) = 0 Then
argNumSS = Left(argNumSS, 2) & Right(argNumSS, Len(argNumSS) - 3)
End If
'//El resultado debe tener siempre dos digitos, para esto lo formateamos
Retorno = Format(argNumSS - (Int(argNumSS / 97) * 97), "00")
Espero que sea de utilidad. |
|
|
|
|
37. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (02/05/2003 13:46, #14112) Por: El cobarde anónimo |
Pues como yo lo he tenio que pasar javascript, asi el sigueinte se ahorra el esfuerzo (minimo, pero algo es algo).
function comprobar_ccc(ccc)
{
var c1,c2,c3,c4;
var parte1, parte2;
c1 = ccc.substr(0,4);
c2 = ccc.substr(4,4);
c3 = ccc.substr(8,2);
c4 = ccc.substr(10,10);
parte1 = c1 + c2;
parte2 = c4;
Apesos = new Array(1,2,4,8,5,10,9,7,3,6);
DC1=0;
DC2=0
x=8;
while(x>0)
{
digito = parte1.substr(x-1,1);
DC1=DC1+(Apesos[x+2-1]*digito)
x = x -1;
}
Resto = DC1 % 11;
// alert("DC1 = "+DC1+" Resto = "+Resto);
DC1=11-Resto;
x=10;
while(x>0)
{
digito = parte2.substr(x-1,1);
DC2=DC2+(Apesos[x-1]*digito)
x = x -1;
}
Resto = DC2 % 11;
// alert("DC1 = "+DC1+" Resto = "+Resto);
DC2=11-Resto;
if (DC2==10) {DC1=1}
if (DC2==11) {DC1=0}
DC = DC1+""+DC2;
//alert(DC);
return (DC==c3);
} |
|
38. Re: Como Calcular el Digito de Control de una Cuenta Corriente en Visual Basic (16/10/2003 12:55, #17504) Por: Yo |
Pues por si os es útil a alguno, yo he convertido el código listado arriba a VB6.
Public Function gfCalculoDC(pstrBanco As String, pstrOficina As String, pstrNCuenta As String) As String
Dim arrPesos
Dim intDC1 As Integer
Dim intDC2 As Integer
Dim intX As Integer
Dim intDigito As Integer
Dim intResto As Integer
Dim strDigitoControl As String
Dim strBancoOficina As String
arrPesos = Array(1, 2, 4, 8, 5, 10, 9, 7, 3, 6) 'Array de "pesos"
strBancoOficina = pstrBanco & pstrOficina
intX = 8
While intX > 0
intDigito = Mid(strBancoOficina, intX, 1)
intDC1 = intDC1 + (arrPesos(intX + 2 - 1) * intDigito)
intX = intX - 1
Wend
intResto = intDC1 Mod 11
intDC1 = 11 - intResto
If intDC1 = 10 Then intDC1 = 1
If intDC1 = 11 Then intDC1 = 0 'Dígito control Entidad-Oficina
intX = 10
While intX > 0
intDigito = Mid(pstrNCuenta, intX, 1)
intDC2 = intDC2 + (arrPesos(intX - 1) * intDigito)
intX = intX - 1
Wend
intResto = intDC2 Mod 11
intDC2 = 11 - intResto
If intDC2 = 10 Then intDC1 = 1
If intDC2 = 11 Then intDC1 = 0 'Dígito Control Cuenta Corriente
strDigitoControl = intDC1 & intDC2 'Los 2 números del D.C.
gfCalculoDC = strDigitoControl
End Function |
|
39. En WMLScript (WAP) (07/01/2006 13:42, #30393) Por: Urreta |
Aviso que es el primer script que hago en WMLScript, pero funciona :-)
No sabia como poner lo del "array" de javascript, así que lo he hecho en plan chapu.
Os pongo un enlace al archivo wml, que no se ve bien en la vista previa, lo podeis probar desde el movil:
http://urrezabal.utilitas.org/wap/index.wml
dc.wmls
======
extern function comprobar(ccc)
{
var c1,c2,c3,c4;
var parte1, parte2;
var DC1,DC2,DC;
var peso,digito,Resto,x,resultado;
c1 = String.subString(ccc,0,4);
c2 = String.subString(ccc,4,4);
c3 = String.subString(ccc,8,2);
c4 = String.subString(ccc,10,10);
parte1 = c1 + c2;
parte2 = c4;
var Apeso1 = 1;
var Apeso2 = 2;
var Apeso3 = 4;
var Apeso4 = 8;
var Apeso5 = 5;
var Apeso6 = 10;
var Apeso7 = 9;
var Apeso8 = 7;
var Apeso9 = 3;
var Apeso10 = 6;
DC1=0;
DC2=0;
x=8;
while(x>0)
{
digito = String.subString(parte1,x-1,1);
if (x==8) {peso=Apeso10;}
if (x==7) {peso=Apeso9;}
if (x==6) {peso=Apeso8;}
if (x==5) {peso=Apeso7;}
if (x==4) {peso=Apeso6;}
if (x==3) {peso=Apeso5;}
if (x==2) {peso=Apeso4;}
if (x==1) {peso=Apeso3;}
DC1=DC1+(peso*digito);
x = x -1;
}
Resto = DC1 % 11;
DC1=11-Resto;
x=10;
while(x>0)
{
digito = String.subString(parte2,x-1,1);
if (x==10) {peso=Apeso10;}
if (x==9) {peso=Apeso9;}
if (x==8) {peso=Apeso8;}
if (x==7) {peso=Apeso7;}
if (x==6) {peso=Apeso6;}
if (x==5) {peso=Apeso5;}
if (x==4) {peso=Apeso4;}
if (x==3) {peso=Apeso3;}
if (x==2) {peso=Apeso2;}
if (x==1) {peso=Apeso1;}
DC2=DC2+(peso*digito);
x = x -1;
}
Resto = DC2 % 11;
DC2=11-Resto;
if (DC2==10) {DC1=1;}
if (DC2==11) {DC1=0;}
DC = DC1+""+DC2;
if (DC==c3) {resultado="CORRECTO";}
else {resultado="ERRONEO";}
WMLBrowser.setVar("resultado", resultado);
WMLBrowser.refresh();
}
Alguien se anima y hace un .jar para el movil, que me vendría de perlas. |
|
40. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (21/09/2006 10:12, #35156) Por: Anónimo |
| El codigo javascript no funciona para todas las cuentas.
Yo he probado con 4 y me han fallado 2. |
|
41. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (28/02/2007 18:59, #38766) Por: Nofre |
Pos vaya patinazo.
Lo he intentado yo, y no funciona bien siempre.
Creo que todas las implementaciones que veo aquí están mal ...
Habéis probado a validar con cuentas como estas?
0019.0020.90.4015469000
2100.0206.06.1234567890
Este algoritmo lo calcula mal y dice que el 90 y el 06 no son el DC correcto, cuando si lo son.
El error está en la comprobación del valor de los DC1 y DC2. Falla si alguno de los dígitos del DC es 0 (p.ej. el 90 o 06 de los contratos anteriores).
En el algoritmo original pone que tiene que ser
if (DC2==10) {DC1=1}
if (DC2==11) {DC1=0}
pero en realidad debería ser
if (DC1==10) {DC1=1}
if (DC1==11) {DC1=0}
if (DC2==10) {DC2=1}
if (DC2==11) {DC2=0}
Con este pequeño cambio funciona siempre.
Me extraña que nadie se haya dado cuenta que el original no funciona en todos los casos ...
:(
|
|
|
42. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (30/09/2003 23:15, #17311) Por: la valiente anónima |
| Par validar si los campos de un formulario están llenos o no necesariamente se necesita Javascript :P
Por otra parte...muy bonito el que ha pegado el código Javascript para validar un NIF, pero me gustaría que además explicara cómo es el algoritmo.
Un saludo desde Cartagena |
|
43. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (13/11/2003 11:15, #18023) Por: Cyberbask |
La ultima parte del script comentado en esta noticia contiene un error. No se si alguien se ha fijado.
En la ultima parte en las lineas:
if ($DC2==10) $DC1=1;
if ($DC2==11) $DC1=0; // Dígito Control C/C
deberia aparecer de este modo:
if ($DC2==10) $DC2=1;
if ($DC2==11) $DC2=0; // Dígito Control C/C
Asi ya deberia funcionar correctamente. Nos vemos |
|
44. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (28/02/2007 19:03, #38768) Por: Nofre |
Y también falta arreglar el DC1!!!
if (DC1==10) {DC1=1}
if (DC1==11) {DC1=0}
if (DC2==10) {DC2=1}
if (DC2==11) {DC2=0}
Con este pequeño cambio funciona siempre.
;)
|
|
|
45. Ahora en C# (13/09/2004 08:50, #23264) Por: bradbury9 |
Esta es una versión en C#, empleando metodos estáticos. Aunque en caso de que se haga en ASP.NET la validación (desde mi punto de vista) deberia hacerse en JavaScript.
public static string devolverCodigoControl(string ctaBanco, string ctaSucursal, string numCuenta)
{
string dc="";
dc = calcularPeso11("48509736",ctaBanco + ctaSucursal);
dc += calcularPeso11("1248509736",numCuenta);
return dc;
}
private static string calcularPeso11(string strPeso,string strCuenta)
{
string dc="";
double dblSuma=0;
for (int i=0;i |
|
46. Re: Ahora en C# - Se ha cortado una de las funciones... (13/09/2004 08:54, #23265) Por: Anónimo |
private static string calcularPeso11(string strPeso,string strCuenta)
{
string dc="";
double dblSuma=0;
for (int i=0;i<strPeso.Length;i++)
{
int intPeso=Convert.ToInt32(strPeso.Substring(i,1));
if(intPeso==0) intPeso=10;
int intCuenta=Convert.ToInt32(strCuenta.Substring(i,1));
dblSuma+=(intPeso*intCue nta);
}
double dblResto = dblSuma % 11;
dblResto = 11 - dblResto;
if(dblResto==10) dblResto=1;
if(dblResto==11) dblResto=0;
dc = dblResto.ToString();
return dc;
} |
|
47. Re: Ahora en C# (20/06/2005 04:26, #27180) Por: Anónimo |
| me gustaria que me enviaran el algoritmo en borland c, lo mas pronto posible .gracias |
|
48. Re: Ahora en C# (04/02/2007 20:42, #38270) Por: Anónimo |
| laaaaaaaaaaaaaaaaaaaa kkkkkkkkkkkkkkkkkkkk |
|
|
|
49. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (22/04/2005 18:05, #26343) Por: Xavi |
Faltaba la de Delphi, lo he intentado hacer lo más clarificador posible aunque para ello haya escrito más código del necesario:
pe: pesos de entidad-sucursal
pc: pesos de cuenta
function CalculoDC(Oficina,Cuenta:String):String;
const pe: array [1..8] of integer=(7,3,6,1,2,4,8,5);
pc: array [1..10] of integer=(10,9,7,3,6,1,2,4,8,5);
var dc1,dc2,x,digito:integer;
begin
dc1:=0;
dc2:=0;
x:=1;
while x |
|
50. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (03/07/2005 13:22, #27341) Por: Maria |
| Por favor alguien m podria facilitar el calculo del digito de la Seguridad Social en excel? GRacias |
|
51. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (14/12/2005 18:40, #30028) Por: O neno |
| Me ha salvado la vida este artículo!
Ahi va mi pequeña aportación: la solución para VB6.
Private Function comprobar_cuenta() As Boolean
Dim aPesos As Variant
Dim DC1, DC2, x, digito, resto As Integer
Dim cuenta, EntOfi, DC As String
Dim result As Boolean
result = False
aPesos = Array(1, 2, 4, 8, 5, 10, 9, 7, 3, 6)
DC1 = 0
DC2 = 0
x = 8
EntOfi = Left(NumCuenta.Text, 4) & Mid(NumCuenta.Text, 6, 4)
DC = Mid(NumCuenta.Text, 11, 2)
cuenta = Right(NumCuenta.Text, 10)
Do While x > 0
digito = CInt(Mid(EntOfi, x, 1))
DC1 = DC1 + (CInt(aPesos(x + 2 - 1)) * digito)
x = x - 1
Loop
resto = DC1 Mod 11
DC1 = 11 - resto
'digito de control entidad-oficina
If DC1 = 10 Then DC1 = 1
If DC1 = 11 Then DC1 = 0
x = 10
Do While x > 0
digito = CInt(Mid(cuenta, x, 1))
DC2 = DC2 + (CInt(aPesos(x - 1)) * digito)
x = x - 1
Loop
resto = DC2 Mod 11
DC2 = 11 - resto
'digito de control cuenta corriente
If DC2 = 10 Then DC1 = 1
If DC2 = 11 Then DC1 = 0
If DC = DC1 & DC2 Then
result = True
End If
comprobar_cuenta = result
End Function
Un saludo. |
|
52. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (24/02/2006 14:29, #31165) Por: Anònim |
El ejemplo de arriba tiene un error!!!!!!:
Cuando calcula el DC2 en las dos ultimas lineas si vale 10 o 11 tiene que cambiar el valor de DC2 y no de DC1.
Quedaria asi:
if($DC2 == 10) $DC2 = 1;
if($DC2 == 11) $DC2 = 0;
|
|
53. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (28/02/2007 19:02, #38767) Por: Nofre |
No sólo de DC2, si no también hay que hacerlo para DC1!!
if (DC1==10) {DC1=1}
if (DC1==11) {DC1=0}
if (DC2==10) {DC2=1}
if (DC2==11) {DC2=0}
Con este pequeño cambio funciona siempre.
;)
|
|
|
54. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (03/03/2006 20:22, #31277) Por: ISRAEL |
a continuacion una funcion en delphi que comprueba si los digitos de control introducidos en un CCC son correctos
//****** COMPRUEBA LOS DIGITOS DE CONTROL DEL CCC ******************************
function ControlDigitosCCC(CCC:string):boolean;
const
Pesos:array [0..9] of byte =(1,2,4,8,5,10,9,7,3,6);
var
DC1,DC2,c,Resto:integer;
st1,st2:string;
begin
Result:=False;
st1:=Copy(CCC,1,8);
st2:=Copy(CCC,11,10);
DC1:=0;
DC2:=0;
for c:=0 to length(st1)-1 do
begin
try
Dc1:=Dc1+strtoint(copy(st1,c+1,1))*Pesos[c+2];
except
exit;
end;
end;
Resto:=DC1 mod 11;
Dc1:=11-Resto;
if DC1=10 then DC1:=1;
if DC1=11 then DC1:=0;
for c:=0 to length(st2)-1 do
begin
try
Dc2:=Dc2+strtoint(copy(st2,c+1,1))*Pesos[c];
except
exit;
end;
end;
Resto:=DC2 mod 11;
Dc2:=11-Resto;
if DC2=10 then DC2:=1;
if DC2=11 then DC2:=0;
try
if (DC1=strtoint(Copy(CCC,9,1))) and (DC2=strtoint(Copy(CCC,10,1))) then Result:=True;
except
end;
end; |
|
55. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (18/04/2006 13:02, #32033) Por: Jose (http://www.loteriadenavidadsevilla.com) |
existe una errata en el código para PHP.
Donde pone:
if ($DC2==10) $DC1=1;
if ($DC2==11) $DC1=0; // Dígito Control C/C
Debe poner
if ($DC2==10) $DC2=1;
if ($DC2==11) $DC2=0; // Dígito Control C/C
Un saludo.
|
|
56. 2ª Letra del CIF/NIF en C++ (30/06/2006 11:11, #33517) Por: Area10 (http://www.area10.es) |
| Hola:
En mi empresa estamos desarrollando una aplicacion empresarial y bueno, he leido por aqui que necesitáis saber como calcular la segunda letra del cif, es algo bastante sencillo, aquí os pego la función que utilizo en mi formulario de Empresas:
string calcularLetra2(string Tcif)
{
int cif;
int aux;
cif=atoi(Tcif.c_str());
aux=(cif-((cif/23)*23));
string letra[24]={"T","R","W","A","G","M","Y","F","P","D","X","B","N","J","Z","S","Q"," V","H","L","C","K","E","T"};
if((aux>-1)&&(aux
return letra[aux];
else
{
createMessageBox().show( "Error,Nif o Cif incorrecto","Error");
return "";
}
}
Espero que os sea útil el codigo, por lo menos tan útil como me fue a mi vuestra versión php de los digitos de control ;)
Saludos.
Jesús Mª Villar Vazquez.
Desarrollador Software. |
|
57. Letra del CIF/NIF en JavaScript (10/10/2006 10:00, #35547) Por: gu |
Bueno, el calculo del NIF, DNI en JavaScript es sencillo.
También valida el de los extrangeros, para lo que se sustituye la X por 0
function calcula(dni) {
/*
Funcion de calculo de letra del NIF
2006/10/10 - Gustavo Durán - mgduran AT gmail.com
*/
dni=dni.toUpperCase()
dni=dni.replace('X','0');
var numero=parseInt(dni/23);
var letra='TRWAGMYFPDXBNJZSQVHLCKE';
dni-=(numero * 23 );
document.forms.nif.letra.value=letra.charAt(dni);
}
Y el formulario en HTML tiene 2 campos, uno que llama a la funcion onKeyUp="calcula(this.value)" y otro al que se asigna el valor de la letra |
|
|
|
58. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (21/07/2006 14:08, #33865) Por: Anónimo (http://www.mencey.net) |
Ya se que programo muy a saco con php, pero aqui os paso mi código algo más corto:
$multi=array(10,9,7,3,6,1,2,4,8,5);$CTA=substr(chop($_GET['cta']), 0, 20);
$cod[]=substr($CTA, 0, 8);$DC=substr($CTA, 8, 2); $cod[]=substr($CTA, -10, 10);
foreach($cod as $cl => $vl){
$a=0;
for ($i=0 ; $i $val){$valsum=($valsum+$val);}
$DIGIT[]=substr(trim($valsum%11), 0, 1); unset($res,$valsum);
}
$digito=trim($DIGIT[0]) . trim($DIGIT[1]);
if($digito != $DC){echo "NO VALIDA";}else{echo "parece correcta";} |
|
59. CORRECCION (25/07/2006 11:08, #33939) Por: El de antes (http://www.mencey.net) |
<?php
$multi=array(10,9,7,3,6,1,2,4,8,5);$CTA=substr(chop($_GET['cta']), 0, 20);
$cod[]=substr($CTA, 0, 8);$DC=substr($CTA, 8, 2); $cod[]=substr($CTA, -10, 10);
foreach($cod as $cl => $vl){
$a=0;
for ($i=0 ; $i<strlen($vl); $i++){
if (($cl) === 0 && ($i === 0)){ $a=2;}
$res[]=(substr($vl, $i, 1) * $multi[$a]);
$a++;
}
foreach($res as $cla => $val){$valsum=($valsum+$val);}
$DIGIT[]=substr(trim($valsum%11), 0, 1); unset($res,$valsum);
}
$digito=trim($DIGIT[0]) . trim($DIGIT[1]);
if($digito != $DC){echo "NO VALIDA";}else{echo "parece correcta";}
?> |
|
60. Re: Como Calcular el Digito de Control de una Cuenta Corriente en PHP (20/10/2006 12:29, #35821) Por: Anònim |
Una mica absurd....
m'acabo de trobar en una pàgina de compra de una companyia telefonica, que volia mirar el procés de compra que utilitzaven...al pas final em comprovaven la meva compte bancaria.....he buscat al google, en 30 segons he trobat akesta pagina i posat la compte que vosaltres ja teniu posada al exemple...
2100 0150 63 0200455826
evidentment, a funcionat i podria aver comprat amb totes les dades falses.... o d'algun enemic.
dewwwwwwwwww
P.D.: No, no he finalitzat la compra, només volia saltarme els controls i arribar al final. |
|
61. INTENTO DE VALIDAR CUENTA CORRIENTE EN PL/SQL (11/08/2010 14:16, #44159) Por: Anonimo |
/******************************************************************************* \
/* VALidación de una CUEnta de BANco *\
/* los pesos de cada dígito (1,2,4,8,5,10,9,7,3,6) *\
/* para el ejemplo 1234-1234-**-1234567890
*****************************************************************************/
procedure val_cue_ban(v_cod_ent in number, v_cod_suc in number,
v_cod_con in number, v_cod_cue in number,
n_campo out number, retorno out varchar2) is
e_salida0 exception;
e_salida1 exception;
e_salida9 exception;
v_1 number; -- para el primer dígito
v_2 number; -- para el segundo dígito
cod_ent varchar2(4);
cod_suc varchar2(4);
cod_con varchar2(2);
cod_cue varchar2(10);
begin
-- los pesos de cada dígito (1,2,4,8,5,10,9,7,3,6)
-- el primero de los dos dígitos de control se corresponde a los 4 dígitos de cod_ent mas los 4 del cod_suc
-- el segundo dígito de control se corresponde a los 10 dígitos de cod_cue
-- v_1 := substr(v_cod_ent,1,1)* 4;
cod_ent := lpad(v_cod_ent,4,0);
cod_suc := lpad(v_cod_suc,4,0);
cod_con := lpad(v_cod_con,2,0);
cod_cue := lpad(v_cod_cue,10,0);
v_1 := (substr(cod_ent,1,1)*4)
+ (substr(cod_ent,2,1)*8)
+ (substr(cod_ent,3,1)*5)
+ (substr(cod_ent,4,1)*10)
+ (substr(cod_suc,1,1)*9)
+ (substr(cod_suc,2,1)*7)
+ (substr(cod_suc,3,1)*3)
+ (substr(cod_suc,4,1)*6);
v_1 := mod(v_1,11) ;
v_1 := 11 - v_1 ;
if v_1 = 10 then
v_1 := 1;
elsif v_1 = 11 then
v_1 := 0;
end if;
v_1 := substr(v_1,-1);
v_2 := (substr(cod_cue,1,1)*1)
+ (substr(cod_cue,2,1)*2)
+ (substr(cod_cue,3,1)*4)
+ (substr(cod_cue,4,1)*8)
+ (substr(cod_cue,5,1)*5)
+ (substr(cod_cue,6,1)*10)
+ (substr(cod_cue,7,1)*9)
+ (substr(cod_cue,8,1)*7)
+ (substr(cod_cue,9,1)*3)
+ (substr(cod_cue,10,1)*6);
v_2 := mod(v_2,11) ;
v_2 := 11 - v_2 ;
if v_2 = 10 then
v_2 := 1;
elsif v_2 = 11 then
v_2 := 0;
end if;
if v_1||v_2 cod_con then
raise e_salida9;
end if;
exception
when e_salida0 then
n_campo := 0;
retorno := '';
when e_salida1 then
n_campo := 1;
retorno := 'Error en el procedimiento pkb_con_val_web.val_cue_ban ' ||
sqlerrm;
when e_salida9 then
n_campo := 9;
retorno := retorno || ' La cuenta del banco no es correcta. '|| v_1||v_2;
when others then
n_campo := 1;
retorno := ' Error en el procedimiento pkb_con_val_web.val_cue_ban OTHERS ' ||
sqlerrm;
end; |
|
|
|
|
|---|
|
|
|
|
Calificacion
    Vots: 50 |
Danos tu opinion:
|
|
|
|
|
|
|