¿Cómo crear un RFC Mexicano en Java?

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();
    }
}
1
задан 05.12.2016, 18:12
2 ответа

Не возможно производить RFC (Федеральный Реестр Налогоплательщиков) начиная с личных данных, потому что homoclave распределен произвольно SAT, и не возможно считать.

RFC строится, в общий способ, следующей формы:

RFC descompuesto en cada caracter

Где первые 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:

ideone.com

6
ответ дан 24.11.2019, 12:16

пробует использовать следующий 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;
}
1
ответ дан 24.11.2019, 12:16