Wie konvertiere ich einen String in ein anderes Gebietsschema?

Lesezeit: 6 Minuten

Benutzer-Avatar
Ariya

Ich muss arabische/persische Zahlen in ihr englisches Äquivalent umwandeln (zum Beispiel “۲” in “2” umwandeln)

Wie kann ich das machen?

  • Beachten Sie, dass “2” immer noch eine arabische Zahl ist.

    – TylerH

    9. Mai um 14:54 Uhr

Benutzer-Avatar
Peter Lawrey

Ich schlage vor, Sie haben eine zehnstellige Nachschlagezeichenfolge und ersetzen alle Ziffern nacheinander.

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);
}

Drucke

42

Der Grund für die Verwendung der Zeichenfolgen als Nachschlagewerk ist, dass andere Zeichen wie z . - , würde so bleiben wie es ist. Tatsächlich würde eine Dezimalzahl unverändert bleiben.

  • Dadurch werden die Nummern geändert extended Arabic-indic Unicode-Unterbereich (۰ bis zu ۹) ins Englische, das normalerweise zur Darstellung von Zahlen in persischen Anwendungen verwendet wird. Es wird sich auch ändern Arabic-indic Unicode-Unterbereich, dessen Ziffern von 0x0660 für Null reichen (٠) bis 0x0669 für neun (۹). Beachten Sie, dass die Ziffern gleich aussehen, aber einen anderen Unicode haben.

    – VSB

    21. September 2020 um 15:53 ​​Uhr

Benutzer-Avatar
Navas Basheer

Ich habe dies erreicht durch java.math.BigDecimal Klasse, unten ist das Code-Snippet

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

Ergebnis

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

Hinweis: Der obige Code funktioniert nicht, wenn andere Zeichen als Ziffern in arabicNumerals vorhanden sind, zum Beispiel: ۴,۲۴۲.۴۲ ergibt a java.lang.NumberFormatExceptionsodass Sie andere Zeichen mit entfernen können Character.isDigit(char ch) in einer anderen Logik und verwenden Sie den obigen Code. Alle Normalfälle funktionieren.

  • Dies ist besser und einfacher (imo) als die gewählte Antwort. Ich wusste es nicht einmal BigDecimal für nicht-westliche Ziffern gesorgt.

    – mohammedkhan

    7. Februar 2016 um 22:56 Uhr

Benutzer-Avatar
Kishath

Ich habe einen einfacheren und schnelleren Weg gefunden, der auch die beiden arabischen Codepages enthält.

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;
}

Es gibt die Zahlen im englischen Format zurück oder umgekehrt, wenn Sie das Ersetzen von ändern.
(“۰”, “0”) bis (“0″,”۰”)

  • ….erzeugt das nicht jedes Mal 20 Strings, wenn Sie es für eine Nummer anrufen? Obwohl ich denke, wenn Sie es nicht in einer massiven for-Schleife verwenden, werden Sie davon kein Problem haben.

    – EpicPandaForce

    3. Februar 2016 um 11:30 Uhr

  • Sie rufen die Methode nicht für jede Zahl auf. Sie parsen einfach die Liste der Zahlen als Zeichenfolge “12432475737485” und ersetzen die arabischen Zeichen. Sie könnten auch “gello374828SomeText” parsen und nur die Zahlen in Arabisch konvertieren

    – Kischath

    17. März 2016 um 7:19 Uhr

Benutzer-Avatar
Sileria

Probieren Sie das aus, Jungs:

/**
 * 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 ) );
}
}

Übrigens gibt es einen Unterschied zwischen arabischen Ziffern und Urdu/Farsi: Arabisch:

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

Urdu oder Farsi:

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

Benutzer-Avatar
Tomasz Nurkiewicz

Erst funktionieren, dann schön aussehen 😉

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

Funktioniert für 2leider kenne ich keine anderen persischen Ziffern, könnten Sie es versuchen?

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

BEARBEITEN: (beyogen auf Peter Lawrey String-Version, aber verwendet 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'));
}

Benutzer-Avatar
Mehdi Khademloo

so triviale Antwort:

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;
}

und

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) hat mir das Leben gerettet, generische Lösung für jedes Gebietsschema.

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();
}

1014590cookie-checkWie konvertiere ich einen String in ein anderes Gebietsschema?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy