¿Cómo convertir una cadena a otra configuración regional?

6 minutos de lectura

avatar de usuario
Ariyan

Necesito convertir números arábigos/persas a su equivalente en inglés (por ejemplo, convertir “۲” a “2”)

¿Cómo puedo hacer esto?

  • Tenga en cuenta que “2” sigue siendo un número arábigo.

    – TylerH

    el dia de ayer

avatar de usuario
pedro laurey

Le sugiero que tenga una cadena de búsqueda de diez dígitos y reemplace todos los dígitos uno a la vez.

public static void main(String... args) {
    System.out.println(arabicToDecimal("۴۲"));
}
//used in Persian apps
private static final String extendedArabic = "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9";

//used in Arabic apps
private static final String arabic = "\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669";

private static String arabicToDecimal(String number) {
    char[] chars = new char[number.length()];
    for(int i=0;i<number.length();i++) {
        char ch = number.charAt(i);
        if (ch >= 0x0660 && ch <= 0x0669)
           ch -= 0x0660 - '0';
        else if (ch >= 0x06f0 && ch <= 0x06F9)
           ch -= 0x06f0 - '0';
        chars[i] = ch;
    }
    return new String(chars);
}

huellas dactilares

42

La razón para usar las cadenas como una búsqueda es que otros caracteres como . - , se dejaría como está. De hecho, un número decimal no cambiaría.

  • Esto cambiará los números en extended Arabic-indic Subrango Unicode (۰ hasta ۹) al inglés, que generalmente se usa para la representación de números en aplicaciones persas. También cambiará Arabic-indic Subrango Unicode, cuyos dígitos van desde 0x0660 para cero (٠) hasta 0x0669 durante nueve (۹). Tenga en cuenta que los dígitos tienen el mismo aspecto pero tienen un Unicode diferente.

    – VSB

    21 de septiembre de 2020 a las 15:53

avatar de usuario
Basheer de Navas

Logré esto por java.math.BigDecimal Clase, a continuación se muestra el fragmento de código

String arabicNumerals = "۴۲۴۲.۴۲";
String englishNumerals = new BigDecimal(arabic).toString();
System.out.println("Number In Arabic : "+arabicNumerals);
System.out.println("Number In English : "+englishNumerals);

Resultado

Number In Arabic : ۴۲۴۲.۴۲
Number In English : 4242.42

NÓTESE BIEN: El código anterior no funcionará si hay caracteres que no sean dígitos numéricos en números arábigos, por ejemplo: ۴, ۲ ۴ ۲. ۴ ۲ dará como resultado un java.lang.NumberFormatExceptionpor lo que puede eliminar otros caracteres usando Character.isDigit(char ch) en otra lógica y use el código anterior. Todos los casos normales están funcionando.

  • Esto es mejor y más simple (imo) que la respuesta elegida. ni siquiera sabía BigDecimal atendió a los dígitos no occidentales.

    – mohammedkhan

    7 febrero 2016 a las 22:56

avatar de usuario
Cisat

Encontré una forma más simple y rápida que también incluye las dos páginas de códigos árabes.

public static String convertToEnglishDigits(String value)
{
     String newValue = value.replace("١", "1").replace("٢", "2").replace("٣", "3").replace("٤", "4").replace("٥", "5")
             .replace("٦", "6").replace("7", "٧").replace("٨", "8").replace("٩", "9").replace("٠", "0")
             .replace("۱", "1").replace("۲", "2").replace("۳", "3").replace("۴", "4").replace("۵", "5")
             .replace("۶", "6").replace("۷", "7").replace("۸", "8").replace("۹", "9").replace("۰", "0");

     return newValue;
}

Devolverá los números en formato inglés o viceversa si cambia el reemplazo de.
(“۰”, “0”) a (“0″,”۰”)

  • ….¿eso no crea 20 cadenas cada vez que lo llamas por un número? Aunque supongo que si no lo usa en un bucle for masivo, no tendrá ningún problema con eso.

    – EpicPandaForce

    03/02/2016 a las 11:30

  • No llamas al método para cada número. Simplemente analiza la lista de números como una cadena “12432475737485” y reemplaza los caracteres árabes. También podría analizar “gello374828SomeText” y obtener solo los números convertidos a árabe

    – Cisat

    17 de marzo de 2016 a las 7:19

avatar de usuario
sileria

Prueba esto chicos:

/**
 * Utility class to detect arabic languages and convert numbers into arabic digits.
 *
 * @author Ahmed Shakil
 * @date 09-24-2012
 */
public final class ArabicUtil {

private static final char[] DIGITS = {'\u0660','\u0661','\u0662','\u0663','\u0664','\u0665','\u0666','\u0667','\u0668','\u0669'};

/**
 * Returns <code>true</code> if the provided language code uses arabic characters; othersise <code>false</code>.
 * @param lang ISO language code.
 * @return <code>true</code> if the provided language code uses arabic characters; othersise <code>false</code>
 */
public static boolean isArabic (String lang) {
    return "ar".equals(lang) || "fa".equals(lang) || "ur".equals(lang);
}

/**
 * Convert digits in the specified string to arabic digits.
 */
public static String convertDigits (String str) {
    if (str == null || str.length() == 0) return str;

    char[] s = new char[str.length()];
    for(int i =0;i<s.length;i++)
        s[i] = toDigit( str.charAt( i ) );

    return new String(s);
}

/**
 * Convert single digit in the specified string to arabic digit.
 */
public static char toDigit (char ch) {
    int n = Character.getNumericValue( (int)ch );
    return n >=0 && n < 10 ? ARABIC[n] : ch;
}

/**
 * Convert an int into arabic string.
 */
public static String toString (int num) {
    return convertDigits( Integer.toString( num ) );
}
}

Por cierto, hay una diferencia entre los dígitos árabes y los urdu/farsi: Árabe:

private static final char[] ARABIC     = {'\u0660', '\u0661', '\u0662', '\u0663', '\u0664', '\u0665', '\u0666', '\u0667', '\u0668', '\u0669'};

Urdu o farsi:

private static final char[] URDU_FARSI = {'\u06f0', '\u06f1', '\u06f2', '\u06f3', '\u06f4', '\u06f5', '\u06f6', '\u06f7', '\u06f8', '\u06f9'};

avatar de usuario
Tomasz Nurkiewicz

Primero haz que funcione, luego haz que se vea bien 😉

public static char persianDigitToEnglish(char persianDigit) {
    return (char) (((int)persianDigit) - ((int)'۲' - (int)'2'));
}

Trabaja para 2lamentablemente no conozco otros dígitos persas, ¿podrías intentarlo?

assertThat(persianDigitToEnglish('۲')).isEqualTo('2');

EDITAR: (Residencia en pedro laurey Versión de cadena, pero utiliza StringBuilder)

public static String persianDigitToEnglish(String persianNumber) {
    StringBuilder chars = new StringBuilder(persianNumber.length());
    for (int i = 0; i < persianNumber.length(); i++)
        chars.append(persianDigitToEnglish(persianNumber.charAt(i)));
    return chars.toString();
}

private static char persianDigitToEnglish(char persianDigit) {
    return (char) (((int)persianDigit) - ((int)'۲' - (int)'2'));
}

avatar de usuario
Mehdi Khademloo

respuesta tan trivial:

public static String convertNumbersToPersian(String str)
{
    String answer = str;
    answer = answer.replace("1","١");
    answer = answer.replace("2","٢");
    answer = answer.replace("3","٣");
    answer = answer.replace("4","٤");
    answer = answer.replace("5","٥");
    answer = answer.replace("6","٦");
    answer = answer.replace("7","٧");
    answer = answer.replace("8","٨");
    answer = answer.replace("9","٩");
    answer = answer.replace("0","٠");
    return answer;
}

y

public static String convertNumbersToEnglish(String str) {
    String answer = str;
    answer = answer.replace("١", "1");
    answer = answer.replace("٢", "2");
    answer = answer.replace("٣", "3");
    answer = answer.replace("٤", "4");
    answer = answer.replace("٥", "5");
    answer = answer.replace("٦", "6");
    answer = answer.replace("٧", "7");
    answer = answer.replace("٨", "8");
    answer = answer.replace("٩", "9");
    answer = answer.replace("٠", "0");
    return answer;
}

Character.getNumericValue(ch) me salvó la vida, solución genérica para cualquier localidad.

static String replaceNonstandardDigits(String input) {
    if (input == null || input.isEmpty()) {
        return input;
    }

    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < input.length(); i++) {
        char ch = input.charAt(i);
        if (Character.isDigit(ch) && !(ch >= '0' && ch <= '9')) {
            int numericValue = Character.getNumericValue(ch);
            if (numericValue >= 0) {
                builder.append(numericValue);
            }
        } else {
            builder.append(ch);
        }
    }
    return builder.toString();
}

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad