Estoy tratando de crear un string
que me arroje una construcción de RFC mexicano con Android Studio y la clase TextWatcher
, en donde necesito la primera letra y primer vocal del apellido paterno, primera letra del apellido materno y primera letra del nombre.
Ejemplo: Diana Alvarez Lopez
Salida: AALD
Este es mi código:
public class MainActivity extends Activity {
private EditText nombreEditText, apellidoEditText, apellidomatEditiText;
private TextView textView;
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
private GoogleApiClient client;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
nombreEditText = (EditText) findViewById(R.id.nombre_et);
String[] arr = nombreEditText.split(" ", 2);
apellidoEditText = (EditText) findViewById(R.id.apellido_et);
textView = (TextView) findViewById(R.id.construccionRFC);
textView.setVisibility(View.VISIBLE);
// Set Text Watcher listener
nombreEditText.addTextChangedListener(rfcWatcher);
apellidoEditText.addTextChangedListener(rfcWatcher);
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
}
private final TextWatcher elrfcWatcher = new TextWatcher() {
public void beforeTextChanged(
CharSequence s, int start, int count, int after
) { }
public void onTextChanged(CharSequence s, int start, int before, int count) {
textView.setVisibility(View.VISIBLE);
}
public void afterTextChanged(Editable s) {
textView.setText(
"" + nombreEditText.getText() + apellidoEditText.getText()
);
}
};
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
public Action getIndexApiAction() {
Thing object = new Thing.Builder()
.setName("Main Page") // TODO: Define a title for the content shown.
// TODO: Make sure this auto-generated URL is correct.
.setUrl(Uri.parse("http://[ENTER-YOUR-URL-HERE]"))
.build();
return new Action.Builder(Action.TYPE_VIEW)
.setObject(object)
.setActionStatus(Action.STATUS_TYPE_COMPLETED)
.build();
}
@Override
public void onStart() {
super.onStart();
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
client.connect();
AppIndex.AppIndexApi.start(client, getIndexApiAction());
}
@Override
public void onStop() {
super.onStop();
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
AppIndex.AppIndexApi.end(client, getIndexApiAction());
client.disconnect();
}
}
Не возможно производить RFC (Федеральный Реестр Налогоплательщиков) начиная с личных данных, потому что homoclave распределен произвольно SAT, и не возможно считать.
RFC строится, в общий способ, следующей формы:
Где первые 2 символа homoclave распределяются проверяя, что нет другого равного RFC (предотвращая homonimias). Какие-то алгоритмы говорят вычислять назначенный по умолчанию homoclave, но это неправильное вычисление, которое не удастся с каждым RFC, который представляет homonimia.
Кроме того, как я объясняю в Как инспектор санкционировать RFC Мексики и Вашей цифры, с правилами, полученными от документа Алгоритм, чтобы производить RFC с homoclave для физических лиц и morales.odt, существуют другие правила, чтобы получать первые 4 символа RFC:
Тильды не приняты во внимание. Например, если первая гласная отцовской фамилии Á
, он будет использоваться A
.
Ñ
он превращается в &
.
Существуют слова, которые не используются, и проигнорированы для вычисления RFC (я присоединяю V):
ОНА, ОНИ, MC, VON, ОНИ, И, МАК, ОНИ ИДУТ, Я
Когда отцовская составная фамилия или материнский звук, берется только первое слово, которое соответствует любому из них.
Если у отцовской фамилии есть 1 или 2 буквы, он не считается, и понимают, что он не имеет.
Если у него нет какого-либо по фамилиям (отцовский или материнский), берется первая и вторая буква фамилии, которая у него есть, и 4to характер будет второй буквой имени.
Когда у отцовской фамилии нет членов собрания с решающим голосом, используется одна X
вместо гласной.
Второй характер не первая гласная, а первая внутренняя гласная. А именно, если первая буква отцовской фамилии - гласная, берется вторая гласная.
Когда имя составлено, берется начальная буква первого имени, но если это МАРИЯ или JOSE, берется инициал второго.
Когда 4 буквы закончатся неудобным словом (он упорядочивает 9), изменяется последняя буква в одну X
. Неудобные слова:
BUEI, ВОЛ, ГАДОСТЬ, ЛОВКИЙ ВОР, CAGA, CAGO, CAKA, CAKO, ВМЕЩАЕТСЯ, ХРОМОЙ ЧЕЛОВЕК, COJE, COJI, ХРОМОЙ, ЗАД, ЗАРОДЫШ, GUEY, JOTO, KACA, KACO, KAGA, KAGO, KOGE, KOJO, KAKA, KULO, ПРИЗЕМЛИТЕСЬ, Я ПРИЗЕМЛЯЮСЬ, МОЧИТЬСЯ, ТЫ МОЧИШЬСЯ, MEON, MION, СОПЛИ, МУЛИЦА, PEDA, ГАЗЫ, ПЕНИС, ШЛЮХА, ПЕДЕРАСТ, QULO, КРЫСА, ПОДЛО
Чтобы получать первые 4 символа RFC продолжая эти правила, мы используем следующую функцию:
public static String primerosCuatroCaracteresRFC(String nombre, String apellidoPaterno, String apellidoMaterno)
{
//Eliminar acentos y llevar a mayúsculas
nombre = eliminarAcentosYSimbolos(nombre);
apellidoPaterno = eliminarAcentosYSimbolos(apellidoPaterno);
apellidoMaterno = eliminarAcentosYSimbolos(apellidoMaterno);
//Nombre: Omitir palabras que no se utilizan, MARIA, JOSE y compuestos, y obtener las 2 primeras letras
Pattern pattern = Pattern.compile("\\A(?:(?:MARIA|JOSE) )?+(?:(?:DEL?|L(?:AS?|OS)|M(?:AC|[CI])|V[AO]N|Y)\\b ?)*+([A-Z&]?)([A-Z&]?)");
final Matcher matcherNom = pattern.matcher(nombre);
matcherNom.find();
//Apellido: Omitir palabras que no se utilizan, y obtener la primera letra y la vocal interna (si el apellido tiene más de 2 letras)
pattern = Pattern.compile("\\A(?:(?:DEL?|L(?:AS?|OS)|M(?:AC|[CI])|V[AO]N|Y)\\b ?)*+(([A-Z&]?)[B-DF-HJ-NP-TV-Z&]*([AEIOU]?)[A-Z&]?)");
final Matcher matcherPat = pattern.matcher(apellidoPaterno);
matcherPat.find();
final Matcher matcherMat = pattern.matcher(apellidoMaterno);
matcherMat.find();
//LETRAS
//Obtener vocal de apellido paterno y letra(s) del nombre
String letraPat = matcherPat.group(2);
String letraMat = matcherMat.group(2);
String letraNom = matcherNom.group(1);
String rfc;
if (letraPat.isEmpty() || letraMat.isEmpty()) {
//Si no tiene alguno de los apellidos (paterno o materno), se toma la primera y segunda letra del apellido que tiene
//y el 4to caracter será la segunda letra del nombre.
rfc = (matcherPat.group(1) + matcherMat.group(1)).substring(0,2) + letraNom + matcherNom.group(2);
}
else if (matcherPat.group(1).length() > 2)
{
String vocal = matcherPat.group(3);
//Cuando el apellido paterno no tiene vocales, se utiliza una X.
if (vocal.isEmpty())
vocal = "X";
rfc = letraPat + vocal + letraMat + letraNom;
}
else
{
//Si el apellido paterno tiene 1 o 2 letras, no se toma la primera vocal,
//y el 4to caracter es la segunda letra del nombre.
rfc = letraPat + letraMat + letraNom + matcherNom.group(2);
}
//Cuando las 4 letras resulten en una palabra inconveniente (regla 9), se modifica la última letra a una X
if (rfc.matches("BUE[IY]|C(?:A[CGK][AO]|O(?:GE|J[AEIO])|ULO)|FETO|GUEY|JOTO|K(?:A(?:[CG][AO]|KA)|O(?:GE|JO)|ULO)|M(?:AM[EO]|E(?:A[RS]|ON)|ION|OCO|ULA)|P(?:E(?:D[AO]|NE)|UT[AO])|QULO|R(?:ATA|UIN)"))
return rfc.substring(0,3) + "X";
else
return rfc;
}
public static String eliminarAcentosYSimbolos(String s)
{
s = Normalizer.normalize(s.replaceAll("[Ññ]","&"), Normalizer.Form.NFD);
s = s.replaceAll("[^&A-Za-z ]", "");
return s.trim().toUpperCase();
}
Результат:
╔═══════════════════╦═════════════════╦═════════════════╦══════╗
║ Nombre ║ Ape. Paterno ║ Ape. Materno ║ RFC ║
╠═══════════════════╬═════════════════╬═════════════════╬══════╣
║ Diana ║ Álvarez ║ López ║ AALD ║
║ María De La Diana ║ Álvarez Gimenez ║ López Fernández ║ AALD ║
║ Alejandro ║ Crávier ║ Céspedez ║ CACX ║
║ Alejandro ║ Céspedez ║ ║ CEAL ║
║ Diego ║ Si ║ Von Pato ║ SPDI ║
║ Diego ║ Schwdt ║ Fierro ║ SXFD ║
║ José María ║ Gil ║ Romero ║ GIRM ║
║ Esteban ║ Petersen ║ Niembro ║ PENX ║
╚═══════════════════╩═════════════════╩═════════════════╩══════╝
Demo:
пробует использовать следующий mГ©todo, что я только что создал, что тебе производит RFC segГєn имя, в mГ©todo tendrГ-схвати ему, что перемещать как параметр стоимость, где пользователь написал имя, и помещать этот mГ©todo в TextWatcher для того, чтобы стало отвечающим совремнным требованиям поле с результатом этого mГ©todo:
public static String generarRFC(String input)
{
String resultado ="";
String nombreSplit[] = input.split(" ");
String nombre = nombreSplit[0];
String apellidoPaterno = nombreSplit[1];
String apellidoMaterno = nombreSplit[2];
boolean vocalEncontrada = false;
//Sacamos la primera letra del apellido paterno
resultado += apellidoPaterno.charAt(0);
//Sacamos la primera vocal del apellido paterno
for(int i=0; i<apellidoPaterno.length() && !vocalEncontrada;i++)
{
String letra = String.valueOf(apellidoPaterno.charAt(i));
for(int j=0; j<vocales.length; j++)
{
if(letra.compareTo(vocales[j]) == 0)
{
resultado += letra;
vocalEncontrada = true;
break;
}
}
}
//Sacamos la primera letra del apellido materno
resultado += apellidoMaterno.charAt(0);
resultado += nombre.charAt(0);
return resultado;
}