Convertir cadena a otra configuración regional en Java

Hola
Necesito convertir los números árabes / persas a su inglés igual (por ejemplo, convertir “2” a “2”)
¿Cómo puedo hacer esto?

Gracias

Sugiero que tengas una cadena de búsqueda de diez dígitos y reemplaces todos los dígitos de a uno por vez.

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

huellas dactilares

 42 

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

java.math.BigDecimal esto mediante la clase java.math.BigDecimal , 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 

NB: El código anterior no funcionará si hay otros caracteres que no sean dígitos numéricos en árabeNumerales, por ejemplo: 4,242.42 dará como resultado java.lang.NumberFormatException , por lo que puede eliminar otros Character.isDigit(char ch) utilizando Character.isDigit(char ch) en otra lógica y use el código anterior. ¡Todos los casos normales funcionan con encanto!

Buen día

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

 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”, “0”) a (“0”, “0”)

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

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

Funciona para 2 , lamentablemente no conozco otros dígitos persas, ¿podría intentarlo?

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

EDITAR : (basado en la versión de Peter Lawrey String, pero usa 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')); } 

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

Por cierto, hay una diferencia entre los dígitos árabes vs. 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'}; 

también funcionará con punto decimal …

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

impresiones 87.598

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

Usa la clase Locale para convertir números.

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

Creo que la mejor manera es cambiar la configuración regional a lo que quiere, por ejemplo,
para el doble número:

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

para Cadena:

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

o DecimalFormat:

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

Creo que en lugar de reemplazar los dígitos uno por uno (que solo funcionaría para los números decimales), debe analizar su número con un NumberFormat en persa a un número, y luego (si es necesario) usar un NumberFormat en inglés para formatearlo de nuevo.