Konvertiere String in ein anderes Gebietsschema in Java

Hallo
Ich muss arabische / persische Zahlen in die englische Sprache umwandeln (zB “2” in “2” umwandeln)
Wie kann ich das machen?

Vielen Dank

Ich schlage vor, Sie haben einen zehnstelligen Lookup-String und ersetzen alle Ziffern nacheinander.

public static void main(String... args) { System.out.println(arabicToDecimal("۴۲")); } private static final String arabic = "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9"; private static String arabicToDecimal(String number) { char[] chars = new char[number.length()]; for(int i=0;i= 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 Nachschlag ist, dass andere Zeichen wie . - , würde belassen wie es ist. Tatsächlich wäre eine Dezimalzahl unverändert.

Ich erreichte dies durch java.math.BigDecimal class, 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 

NB: Der obige Code funktioniert nicht, wenn andere Zeichen als numerische Ziffern in arabicNumerals vorhanden sind. ZB: 4,242.42 führt zu java.lang.NumberFormatException , so dass Sie andere Character.isDigit(char ch) mit Character.isDigit(char ch) in einer anderen Logik und verwende den obigen Code. Alle normalen Fälle funktionieren charmant !!

Schönen Tag

Ich fand einen einfacheren und schnelleren Weg, 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 wird die Zahlen im englischen Format zurückgeben oder umgekehrt, wenn Sie das Ersetzen von ändern.
(“0”, “0”) bis (“0”, “0”)

Mach es erst mal gut, dann lass es gut aussehen 😉

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

Works for 2 , leider kenne ich keine anderen persischen Ziffern, könntest du es versuchen?

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

EDIT : (basierend 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')); } 

Probieren Sie diese Leute aus:

 /** * 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 true if the provided language code uses arabic characters; othersise false. * @param lang ISO language code. * @return true if the provided language code uses arabic characters; othersise false */ 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=0 && n < 10 ? ARABIC[n] : ch; } /** * Convert an int into arabic string. */ public static String toString (int num) { return convertDigits( Integer.toString( num ) ); } } 

BTW gibt es einen Unterschied zwischen arabischen Ziffern vs. 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'}; 

es wird auch mit Dezimalpunkt arbeiten ..

 public class mainsupport { public static void main(String args[]){ // String Numtoconvert="15.3201" ; // String Numtoconvert="458" ; String Numtoconvert="٨٧٫٥٩٨" ; // integer value 87.598 System.out.println(getUSNumber(Numtoconvert)); } private static String getUSNumber(String Numtoconvert){ NumberFormat formatter = NumberFormat.getInstance(Locale.US); try { if(Numtoconvert.contains("٫")) Numtoconvert=formatter.parse(Numtoconvert.split("٫")[0].trim())+"."+formatter.parse(Numtoconvert.split("٫")[1].trim()); else Numtoconvert=formatter.parse(Numtoconvert).toString(); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } return Numtoconvert; } 

druckt 87.598

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

Verwenden Sie die Locale-class, um Zahlen zu konvertieren.

  Locale locale = new Locale("ar"); String formattedArabic = format(locale, "%d", value)); 

Ich denke, der beste Weg ist, das Gebietsschema zu ändern, was Sie zum Beispiel wollen,
für die doppelte Nummer:

 NumberFormat fmt = NumberFormat.getNumberInstance(Locale.US); d = Double.parseDouble(s); 

für String:

 NumberFormat.getNumberInstance(Locale.US).format(s); 

oder DecimalFormat:

 double num; DecimalFormat df = new DecimalFormat("###.###"); df.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.US)); String s = df.format(num); 

Ich denke, anstatt die Ziffern nacheinander zu ersetzen (was nur für Dezimalzahlen funktionieren würde), sollten Sie Ihre Zahl mit einem persischen Zahlenformat zu einer Zahl analysieren und dann (falls notwendig) ein englisches Zahlenformat verwenden, um es erneut zu formatieren.